Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DirectX 11着色器错误。仅接收NaN的像素着色器_Directx_Shader_Nan_Directx 11 - Fatal编程技术网

DirectX 11着色器错误。仅接收NaN的像素着色器

DirectX 11着色器错误。仅接收NaN的像素着色器,directx,shader,nan,directx-11,Directx,Shader,Nan,Directx 11,大家好。我开始重新编码引擎,将其转换为directx 11。我现在正试图让基本的工作,但这个错误真的阻止了我。 我创建了一个基本着色器,它是法线和视图的简单点积。我让它编译没有错误,但它不工作。 它只是使输入网格完全变形。我在vs2012中开始调试,发现像素着色器在所有NaN中都作为输入。我附加了两个屏幕和着色器代码,如果有人能提供任何想法,这将是真正的apriciated 顶点着色器 //---------------------------------------------------

大家好。我开始重新编码引擎,将其转换为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,我将尝试一下,但我从这里的教程中复制了这些代码:而且这些教程很有效。