DirectX 11着色器错误。仅接收NaN的像素着色器
大家好。我开始重新编码引擎,将其转换为directx 11。我现在正试图让基本的工作,但这个错误真的阻止了我。 我创建了一个基本着色器,它是法线和视图的简单点积。我让它编译没有错误,但它不工作。 它只是使输入网格完全变形。我在vs2012中开始调试,发现像素着色器在所有NaN中都作为输入。我附加了两个屏幕和着色器代码,如果有人能提供任何想法,这将是真正的apriciated 顶点着色器DirectX 11着色器错误。仅接收NaN的像素着色器,directx,shader,nan,directx-11,Directx,Shader,Nan,Directx 11,大家好。我开始重新编码引擎,将其转换为directx 11。我现在正试图让基本的工作,但这个错误真的阻止了我。 我创建了一个基本着色器,它是法线和视图的简单点积。我让它编译没有错误,但它不工作。 它只是使输入网格完全变形。我在vs2012中开始调试,发现像素着色器在所有NaN中都作为输入。我附加了两个屏幕和着色器代码,如果有人能提供任何想法,这将是真正的apriciated 顶点着色器 //---------------------------------------------------
//----------------------------------------------------------------------------
// 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>
在调用vertex函数之前,尝试将WorldViewProjection矩阵连接成一个矩阵。希望所有的计算机都正常,不是说,都是零?您可能还希望在HLSL代码中将矩阵类型显式设置为“矩阵”,或者仅将变换声明为“float4x4”。在调用顶点函数之前,尝试将WorldViewProjection矩阵连接为一个矩阵。希望所有的计算机都正常,不是说,都是零?您可能还希望显式地将HLSL代码中的矩阵类型设置为“矩阵”,或者仅将转换声明为“float4x4”。好的,我解决了它。将任何矩阵传递给着色器时,必须使用DirectX::XMMatrixTranspose()。
(DirectX;) 好的,我解决了。将任何矩阵传递给着色器时,必须使用DirectX::XMMatrixTranspose()。
(DirectX;) 只有在DirectX 11中,在将矩阵发送到着色器之前,您必须转置矩阵。它们改变了您在着色器中保留和使用结构的方式只有在DirectX 11中,在将矩阵发送到着色器之前,您必须转置矩阵。它们改变了您在着色器中保留和使用结构的方式您可以在着色器中使用#pragma pack_matrix(row_major)而不是在cpu端转换矩阵您可以在着色器中使用#pragma pack_matrix(row_major)而不是在cpu端转换矩阵它们似乎是正确的,顶点着色器会相应地乘以位置,但会扭曲法线。尽管如此,像素着色器仍然只能得到NaN,我会尝试一下,但我从这里的教程中复制了代码:教程很有效。它们看起来是正确的,顶点着色器正确地乘以了位置,但它扭曲了法线。尽管如此,像素着色器仍然只能得到NaN,我将尝试一下,但我从这里的教程中复制了这些代码:而且这些教程很有效。