你如何计算HLSL中的寄存器?

时间:2010-08-07 23:21:19

标签: graphics xna 3d hlsl

使用着色器模型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;

我消耗了多少个寄存器?我怎么算他们?

1 个答案:

答案 0 :(得分:4)

每个常数寄存器为float4

float3float2float将分配整个注册表。 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 registersvs_2_0 registers的列表。