2013-01-04 150 views
1

Hy大家。我開始重新編寫我的引擎,將其轉換爲directx 11.我現在試圖使基礎工作,但這個錯誤真的阻止我。 我創建了一個基本着色器,一個普通和視圖的簡單點積。我知道它沒有錯誤編譯,但它dosnt的作品。 它只是使輸入網格變形。我開始在vs2012中進行調試,發現像素着色器正在輸入所有的NaN。我附加了兩個屏幕和着色器代碼,如果有人可以提供任何想法,那麼它將會非常有用。DirectX 11着色器錯誤。像素着色器只接收NaN

VS2012 Debugging info 1 VS2012 Debugging info 2

的Vertex Shader

//---------------------------------------------------------------------------- 
// 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; 
} 

而這裏的Pixel Shader

//------------------------------------------------------------------------------ 
// 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> 

回答

0

好吧,我解決了這個問題。您MUST使用的DirectX :: XMMatrixTranspose()當你通過任何矩陣着色器。 整蠱的DirectX;)

0

嘗試簡單地串接WorldViewProjection矩陣轉換成一個,調用函數的頂點之前。希望所有這些compnenets都可以,而不是全部爲零?您可能還需要將HLSL代碼中的矩陣類型顯式設置爲「matrix < float,4,4 >」,或者將變換聲明爲「float4x4」。

+0

他們似乎是正確的,頂點着色器將位置相應地相乘,但它將正常情況擰緊。只有儘管如此,像素着色器得到NaN的 我會盡力的,但是我在這裏複製從教程,代碼:HTTP://code.msdn.microsoft.com/windowsdesktop/Direct3D-Tutorial-Win32-829979ef和輔導工作。 –

+0

我試過了,仍然是一樣的錯誤。 –

0

只有在DirectX 11的,你必須轉置矩陣berfore將它們發送到着色器。他們改變你保持和工作方式與結構着色器

1

你可能只是在你的着色器使用#pragma pack_matrix(row_major),而不是tranposing矩陣的CPU側