You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:12:09