Ошибка шейдера DirectX 11. Пиксельный шейдер получает только NaN

Всем привет. Я начал перекодировать свой движок, чтобы преобразовать его в DirectX 11. Сейчас я пытаюсь заставить работать основы, но эта ошибка меня действительно останавливает. Я создал базовый шейдер, простой точечный продукт нормали и вида. Мне удалось скомпилировать его без ошибок, но он не работает. Он просто полностью деформирует входную сетку. Я начал отладку в vs2012 и обнаружил, что пиксельный шейдер получает на входе все NaN. Я прикрепил два экрана и код шейдера, если кто-то может предложить какие-то идеи, это было бы действительно приемлемо.

VS2012 Debugging info 1  VS2012 Debugging info 2

Вершинный шейдер

//----------------------------------------------------------------------------   
// Constant Buffer Variables
//----------------------------------------------------------------------------
cbuffer ConstantBuffer : register( b0 )
{
matrix World;
matrix View;
matrix Projection;
//float3 CameraPos;
float Power;
}

//--------------------------------------------------------------------------- 
struct VS_INPUT
{
   float4 Pos : POSITION;
   float3 Normal : NORMAL;
};
struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
float3 Normal : TEXCOORD0;
};

//--------------------------------------------------------------------------
// Vertex Shader
//-------------------------------------------------------------------------------
VS_OUTPUT VS( VS_INPUT input)
{
   VS_OUTPUT output = (VS_OUTPUT)0;

   output.Pos = mul( input.Pos, World );
   output.Pos = mul( output.Pos, View );
   output.Pos = mul( output.Pos, Projection );
   output.Normal = mul( float4( input.Normal, 1 ), World ).xyz;
   //output.wNormal = input.Normal;
   return output;
 }

А вот и пиксельный шейдер

//------------------------------------------------------------------------------
// Constant Buffer Variables
//------------------------------------------------------------------------------
cbuffer ConstantBuffer : register( b0 )
{
matrix World;
matrix View;
matrix Projection;
float Power;
}

//------------------------------------------------------------------------------
struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
float3 wNormal : TEXCOORD0;
};


//-----------------------------------------------------------------------------
// Pixel Shader
//-----------------------------------------------------------------------------
float4 PS( VS_OUTPUT input) : SV_Target
{
    //return pow(dot(input.wNormal,float3(0,0,0)),Power); // fixed camera, just for now
return float4(0.1,0.6,0.1,1);
}

И, наконец, я создал файловую структуру xml для своих шейдеров, которую затем анализирую, не знаю, актуально ли это, но

<?xml version="1.0" encoding="utf-8"?>
<vs path = "D:\\Documentos\\Visual Studio 2012\\Projects\\Fusion Engine\\Tests\\ConstantLighting_VS.hlsl" name ="VS" target = "vs_4_0">
</vs>
<ps path = "D:\\Documentos\\Visual Studio 2012\\Projects\\Fusion Engine\\Tests\\ConstantLighting_PS.hlsl" name ="PS" target = "ps_4_0">
  <val1 type = "scalar" value = "0.456645" name = "Power"/>
</ps>

person Santiago Pacheco    schedule 04.01.2013    source источник


Ответы (4)


Вы можете просто использовать #pragma pack_matrix (row_major) в своем шейдере вместо переноса матриц на стороне процессора.

person Cory Barker    schedule 22.02.2014

Попробуйте просто объединить матрицы WorldViewProjection в одну перед вызовом вершинной функции. Надеюсь, все эти компании были в порядке, а не, скажем, все нули? Вы также можете явно указать тип матрицы в коде HLSL как «matrix‹ float, 4, 4 ›» или просто объявить преобразование (-я) как «float4x4».

person bjorke    schedule 04.01.2013
comment
Они оказались верными, и вершинный шейдер правильно умножает положение, но при этом скручивает нормаль. Тем не менее, пиксельный шейдер получает только NaN, я попробую это, но я скопировал этот код из руководств здесь: code.msdn.microsoft.com/windowsdesktop/, и эти руководства работают. - person Santiago Pacheco; 04.01.2013

Хорошо, я решил это. Вы ДОЛЖНЫ использовать DirectX :: XMMatrixTranspose () при передаче любой матрицы шейдеру. Хитрый DirectX;)

person Santiago Pacheco    schedule 04.01.2013

Только в DirectX 11 вы должны транспонировать матрицы перед отправкой их шейдеру. Они изменили способ хранения и работы со структурами в шейдерах.

person Sergiu Craitoiu    schedule 05.01.2013