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

1 3d graphics xna 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;
Run Code Online (Sandbox Code Playgroud)

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

And*_*ell 5

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

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

真正了解着色器正在使用什么的唯一方法是反汇编它。为此,您可能对我刚才问的这个问题感兴趣:HLSL:在编译时强制执行常量寄存器限制

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

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

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