DirectX12 ExecuteIndirect的HLSL中是否有gl_DrawID等效变量?
HLSL中对应GLSL gl_DrawID的等效变量
HLSL里确实有和GLSL的gl_DrawID对应的系统变量——SV_DrawID,专门用于多绘制(包括ExecuteIndirect场景)中标识当前的绘制调用索引,完全能满足你想要共享同一个UAV/结构化缓冲区、不用每次修改根常量的需求。
怎么使用SV_DrawID
你可以在着色器的输入参数里直接声明这个系统值,比如在顶点着色器中:
struct VSInput { float3 position : POSITION; // 其他顶点属性... }; struct PSInput { float4 position : SV_POSITION; // 其他输出属性... }; StructuredBuffer<MyDrawData> drawDataBuffer : register(t0); PSInput VS(VSInput input, uint drawID : SV_DrawID) { PSInput output; // 使用drawID索引结构化缓冲区,获取当前绘制的专属数据 MyDrawData currentData = drawDataBuffer[drawID]; // 基于currentData处理顶点位置等逻辑 output.position = mul(float4(input.position, 1.0), currentData.modelMatrix); return output; }
和根常量方案的对比
- 当所有绘制调用共享同一个缓冲区,仅通过索引区分数据时,
SV_DrawID更便捷:你不需要在间接缓冲区里额外携带根常量数据,也不用每次绘制都修改根签名绑定,直接通过系统变量自动获取当前绘制的索引即可。 - 根常量方案更适合传递少量、非索引关联的动态数据,但如果只是为了索引共享缓冲区,
SV_DrawID是更轻量化的选择。
注意事项
SV_DrawID支持在顶点、外壳、域、几何、像素着色器中使用,值从0开始,按ExecuteIndirect提交的绘制调用顺序依次递增。- DX12及以上版本的设备均原生支持该变量,无需额外特性检查。
内容的提问来源于stack exchange,提问作者yosmo78
相关产品推荐
相关产品推荐

