1

使用着色器模型 2.0,您可以拥有 256 个常量寄存器。我一直在研究各种着色器,并试图弄清楚什么是单个寄存器?

例如,在我的实例着色器中,我在函数外部的顶部声明了以下变量:

float4x4 InstanceTransforms[40];
float4 InstanceDiffuses[40];

float4x4 View;
float4x4 Projection;

float3 LightDirection = normalize(float3(-1, -1, -1));
float3 DiffuseLight = 1;
float3 AmbientLight = 0.66; 

float Alpha;

texture Texture;

我消耗了多少寄存器?我如何计算它们?

4

1 回答 1

6

每个常量寄存器都是一个float4.

float3float2并且float每个人都会分配一个完整的寄存器。float4x4将使用 4 个寄存器。数组将简单地将分配的寄存器数量乘以元素数量。并且编译器可能会自己分配一些寄存器用作各种计算中的常量。

真正判断着色器使用什么的唯一方法是拆解它。为此,您可能对我刚才问的这个问题感兴趣:HLSL: Enforce Constant Register Limit at Compile Time

您可能还会发现这个值得一看:HLSL: Index to unaligned/packed floats。它解释了为什么 40 的数组float将使用 40 个寄存器,以及如何使它使用 10。

texture将使用纹理采样器(其中有 16 个),而不是常量寄存器。

作为参考,这里是ps_2_0 寄存器vs_2_0 寄存器的列表。

于 2010-08-08T03:18:34.123 回答