使用着色器模型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;
我消耗了多少个寄存器?我怎么算他们?
答案 0 :(得分:4)
每个常数寄存器为float4
。
float3
,float2
和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 registers和vs_2_0 registers的列表。