Как вы считаете регистры в HLSL? - PullRequest
1 голос
/ 08 августа 2010

С шейдерной моделью 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 Ответ

4 голосов
/ 08 августа 2010

Каждый регистр констант является float4.

float3, float2 и float будут выделять целый регистр. float4x4 будет использовать 4 регистра. Массивы просто умножат количество регистров, выделенных на количество элементов. И компилятор, вероятно, выделит несколько регистров для использования в качестве констант в различных вычислениях.

Единственный способ действительно сказать, что использует шейдер, - это разобрать его. С этой целью вас может заинтересовать вопрос, который я задал некоторое время назад: HLSL: Принудительное ограничение регистра констант во время компиляции

Вы также можете найти этот вариант заслуживающим внимания: HLSL: индекс для не выровненных / упакованных поплавков . Это объясняет, почему массив из 40 float s будет использовать 40 регистров, и как вы можете использовать его вместо 10.

Ваш texture будет использовать текстурный сэмплер (у вас их 16), а не постоянный регистр.

Для справки, вот список регистров ps_2_0 и vs_2_0 регистров .

...