hlsl 中使用的常量缓冲区 (cbuffer) 究竟是什么?
What exactly is a constant buffer (cbuffer) used for in hlsl?
目前我的顶点着色器中有这段代码class:
cbuffer MatrixBuffer {
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix; };
我不知道为什么我需要将这些变量包装在 cbuffer 中。如果我删除缓冲区,我的代码也能正常工作。如果有人能给我一个简短的解释为什么需要使用 cbuffer,我将不胜感激。
它以任何一种方式工作的原因是由于在 Direct3D 8/Direct3D 9 中处理常量的传统方式。当时,整个着色器只有一个共享常量数组(一个用于 VS,一个用于PS)。这要求您每次调用 Draw
.
时都必须更改常量数组
在 Direct3D 10 中,常量被重新组织到一个或多个常量缓冲区中,以便更容易地更新一些常量而保留其他常量,从而减少向 GPU 发送的数据。
See the classic presentation Windows to Reality: Getting the Most out of Direct3D 10 Graphics in Your Games for a lot of details on the impacts of constant update.
这里的结果是,如果您不指定 cbuffer
,所有常量都会被放入绑定到寄存器 b0
的单个隐式常量缓冲区中以模拟旧的 'one constants array'行为。
There are compiler flags to control the acceptance of legacy constructs: /Gec
for backwards compatibility mode to support old Direct3D 8/9 intrinsics, and /Ges
to enable a more strict compilation to weed out older constructs. That said, the HLSL compiler will pretty much always accept global constants without cbuffer
and stick them into a single implicit constant buffer because this pattern is extremely common in shader code.
目前我的顶点着色器中有这段代码class:
cbuffer MatrixBuffer {
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix; };
我不知道为什么我需要将这些变量包装在 cbuffer 中。如果我删除缓冲区,我的代码也能正常工作。如果有人能给我一个简短的解释为什么需要使用 cbuffer,我将不胜感激。
它以任何一种方式工作的原因是由于在 Direct3D 8/Direct3D 9 中处理常量的传统方式。当时,整个着色器只有一个共享常量数组(一个用于 VS,一个用于PS)。这要求您每次调用 Draw
.
在 Direct3D 10 中,常量被重新组织到一个或多个常量缓冲区中,以便更容易地更新一些常量而保留其他常量,从而减少向 GPU 发送的数据。
See the classic presentation Windows to Reality: Getting the Most out of Direct3D 10 Graphics in Your Games for a lot of details on the impacts of constant update.
这里的结果是,如果您不指定 cbuffer
,所有常量都会被放入绑定到寄存器 b0
的单个隐式常量缓冲区中以模拟旧的 'one constants array'行为。
There are compiler flags to control the acceptance of legacy constructs:
/Gec
for backwards compatibility mode to support old Direct3D 8/9 intrinsics, and/Ges
to enable a more strict compilation to weed out older constructs. That said, the HLSL compiler will pretty much always accept global constants withoutcbuffer
and stick them into a single implicit constant buffer because this pattern is extremely common in shader code.