gl_DrawID 相当于 Directx12 ExecuteIndirect HLSL

问题描述 投票:0回答:1

在 OpenGL 多重绘制着色器中,我们在 glsl 着色器中使用

gl_DrawID
并访问着色器存储缓冲区对象 (SSBO) 中的数组。在 DirectX12 中,随着 ExecuteIndirect 的出现,我想知道是否为 HLSL 定义了类似的系统变量?

我知道我们可以更改每次绘制的 RootConstant 作为间接缓冲区结构的一部分,但如果我想要在每次绘制的根常量中绑定相同的 UAV 缓冲区或结构化缓冲区,那么使用等效的

gl_DrawID
会很好或者它只是不可用,我被迫在每次绘制时更改根常量?

winapi hlsl directx-12
1个回答
0
投票

正如您提到的,经典的 D3D 方法是使用根常量。不幸的是,添加对系统值的支持显然需要更新着色器模型,因此我认为我们不会很快获得访问绘制索引的内置方法。这是不幸的,因为 SPIR-V 还提供了 DXC 可以定位的内置变量

DrawIndex
。最好有一个语义变量映射到它,因为它允许在 API 之间轻松地重用着色器,而无需定义单独的存储模型。

同时,着色器模型 6.8 引入了

SV_StartInstanceLocation
,可用于解决此限制。只需在将间接命令记录到所需的绘制索引时设置启动实例即可。如果您仍然想使用实例 ID 从(无绑定)缓冲区查询对象数据,这至少允许您引入一种间接寻址,其中您使用一个缓冲区将绘制索引映射到实例并使用
SV_StartInstanceLocation
来解析它然后才查询您的实际缓冲区。缺点是着色器模型 6.8 需要相对较新的硬件/驱动程序,因为它还引入了工作图支持。

© www.soinside.com 2019 - 2024. All rights reserved.