2013-04-09 5 views
0

Я работаю в HLSL, и я получаю эту ошибку от одного из моих шейдеров:FXC ошибка «максимальный показатель температуры регистра превысил»

ошибки X4505: максимальный показатель температуры регистра превысил

линия, которая вызывает это:

int count = Passes[input.Tex.y].y; 

Пропуска определяется как:

cbuffer Style 
{ 
    float3 Passes[256]; 
    ... 
} 

и input.Tex - это float2, объявленный как TEXCOORD.

Может ли кто-нибудь объяснить эту ошибку мне, пожалуйста? Это не документировано на MSDN (или где-либо еще, насколько я могу судить), и мне непонятно, что здесь не так.

Я использую шейдерную модель 4.0 уровня 9_3.

ответ

0

Прямо сейчас он считывает поплавок как целочисленный индекс в массив. Скажем, ваш float 1.0f, это означает 3F80 0000 в шестнадцатеричном виде или 1,065,353,216 в десятичной системе. Теперь он пытается прочитать адрес Passes + 1065353216 * sizeof(float3) Этот довольно высокий индекс реестра превышен, учитывая, что одна константа содержит 4096 max константу.

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476898(v=vs.85).aspx#Shader_Constant_Buffer

0

Если это в пиксельный шейдер, индексация массива может не поддерживаться, и компилятор может генерировать код, как это:

if (input.Tex.y == 0) 
    count = Passes[0]; 
else if (input.Tex.y == 1) 
    count = Passes[1]; 
... 
else if (input.Tex.y == 255) 
    count = Passes[255]; 

Я считаю, уровень 9_3 код не поддерживает индексирование массива в пиксельном шейдере. Вы должны проверить разборку очень длинного кода. Возможно, вам придется уменьшить 256 до 128 или 64, чтобы скомпилировать его.