目前,我的顶点着色器类中有以下代码:
cbuffer MatrixBuffer {
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix; };
我不知道为什么需要将这些变量包装在cbuffer中。如果删除缓冲区,我的代码也可以正常工作。如果有人能简短地解释为什么必须使用cbuffer,我将不胜感激。
答案 0 :(得分:2)
任一种方式起作用的原因是由于Direct3D 8 / Direct3D 9中处理了常量的传统方式。那时,整个着色器只有一个共享的常量数组(一个用于VS,一个用于PS)。 。这要求您每次调用Draw
时都必须更改常量数组。
在Direct3D 10中,将常量重新组织为一个或多个常量缓冲区,以使更新某些常量而不离开其他常量变得更加容易,从而将较少的数据发送到GPU。
有关持续更新的影响,请参见经典演示文稿Windows to Reality: Getting the Most out of Direct3D 10 Graphics in Your Games。
这里的结果是,如果您不指定cbuffer
,则所有常量都将放入绑定到寄存器b0
的单个隐式常量缓冲区中,以模拟旧的'one常量数组的行为。
有编译器标志来控制对旧结构的接受:
/Gec
用于向后兼容模式以支持旧的Direct3D 8/9内部函数,而/Ges
用于更严格的编译以淘汰旧结构。也就是说,HLSL编译器几乎总是接受不带cbuffer
的全局常量,并将它们粘贴到单个隐式常量缓冲区中,因为这种模式在着色器代码中极为常见。