2010-03-22 3 views
0

Я немного переживаю с шейдерами, и я продолжаю получать эту странную ошибку компиляции, которая сводит меня с ума!Ошибка пиксельной шейдерной ошибки компиляции

следующий пиксель код шейдера фрагмент:

  DirectionVector = normalize(f3LightPosition[i] - PixelPos); 
      LightVec = PixelNormal - DirectionVector; 

      // Get the light strenght factor 
      LightStrFactor = float(abs((LightVec.x + LightVec.y + LightVec.z)/3.0f)); 

      // TEST!!! 
      LightStrFactor = 1.0f; 

      // Add this light to the total light on this pixel 
      LightVal += f4Light[i] * LightStrFactor; 

работает отлично, но как только я удалить "LightStrFactor = 1.0f;" строка, то есть разрешение значения «LightStrFactor» является результатом вычисления выше, он не может скомпилировать шейдер.

LightStrFactor поплавковый LightVal & f4Light [я] являются float4 Все остальные float3.

мой вопрос, кроме того, почему он не скомпилирован, так же как DX-компилятор заботится о стоимости поплавка? даже если мои значения неверны, не должно ли это быть временем выполнения? код компиляции шейдеров это:

/* Compile the bitch */ 
if (FAILED(D3DXCompileShaderFromFile(fileName, NULL, NULL, "PS_MAIN", "ps_2_0", 0, &this->m_pCode, NULL, &this->m_constantTable))) 
    GraphicException("Failed to compile pixel shader!"); // <-- gets here :(

if (FAILED(g_D3dDevice->CreatePixelShader((DWORD*)this->m_pCode->GetBufferPointer(), &this->m_hPixelShader))) 
    GraphicException("Failed to create pixel shader!"); 

this->m_fLoaded = true; 

любая помощь приветствуется спасибо !!! :]

+2

Какое сообщение об ошибке? Потратьте время, чтобы получить ошибки и вывести их во время компиляции, это будет экономия времени. – Coincoin

ответ

0

Не забывайте, что шейдеры получают оптимизацию при их компиляции. Возможно, это не сработает, если вы жестко задаете значение.

Когда вы жестко задаете значение сразу после присвоения ему уравнения, все уравнение будет оптимизировано, и вы останетесь только с окончательным назначением.

+0

весь код действовал очень вуду и имел много необъяснимых ошибок. после того, как вы упомянули о «оптимизации», я вдруг вспомнил, что у меня было много бесполезного тестового кода и переменных, и, видимо, они потребляли все мое место на карте или что-то в этом роде. очищая их и переписывая все более эффективно работающие вещи. спасибо :) – ytrewq

0

Пиксельные шейдеры не поддерживают отливки в стиле C++ - float( ... ) в вашем примере. Поскольку он полностью избыточен, вы можете просто избавиться от него, но если вы хотите отливку, используйте (float), как в C

+0

на самом деле они действительно позволяют. по крайней мере, в версии, которую я использую. , но спасибо в любом случае – ytrewq

+0

Что произойдет, если вы полностью удалите бросок? – Goz

0

Из вашего фрагмента шейдера, похоже, вы повторяете множество огней, накапливая их вклад ,

Мое предположение заключается в том, что когда компилятор разворачивает цикл с вашими фактическими вычислениями затухания света, скомпилированный шейдер использует больше арифметических слотов команд, чем поддерживает профиль ps_2_0 (максимум 64 инструкции).

При замене вычислений с помощью LightStrFactor = 1 компилятор полностью оптимизирует три предшествующие строки кода, что приводит к значительному сокращению тестового шейдера и, следовательно, установке внутри выделенных 64 инструкций.

Если возможно для целевой среды вашего приложения, просто напасть на версию профиля шейдера, чтобы ваш шейдер мог использовать больше слотов для инструкций и скомпилировать без ошибок. Любой из ps_3_0/ps_2_a/ps_2_b должен иметь возможность компилировать ваш шейдер. (Профили 2_a/b являются sorta bastard, но официально поддерживаются расширениями NV/ATI к базовому профилю 2_0)

(Как уже упоминалось в другом ответе, время, затрачиваемое на сбор и распечатку ошибок компиляции, будет полезно в то время как.)

Смежные вопросы