1

大家好。我开始重新编码我的引擎以将其转换为 Directx 11。我现在正试图让基础工作正常,但这个错误真的阻止了我。我创建了一个基本着色器,一个法线和视图的简单点积。我让它编译没有错误,但它不工作。它只是使输入网格完全变形。我开始在 vs2012 中调试,发现像素着色器将所有 NaN 作为输入。我附上了两个屏幕和着色器代码,如果有人可以提供任何想法,那将是非常宝贵的。

VS2012 调试信息 1 VS2012 调试信息 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>
4

4 回答 4

1

您可以在着色器中使用 #pragma pack_matrix(row_major) 而不是在 cpu 端转置矩阵

于 2014-02-22T16:24:58.367 回答
0

只有在 DirectX 11 中,您必须在将矩阵发送到着色器之前对其进行转置。它们改变了您在着色器中保存和使用结构的方式

于 2013-01-05T17:13:16.750 回答
0

好的,我解决了。将任何矩阵传递给着色器时,必须使用DirectX::XMMatrixTranspose()。棘手的 DirectX ;)

于 2013-01-04T20:49:14.660 回答
0

在调用顶点函数之前,尝试简单地将 WorldViewProjection 矩阵连接成一个矩阵。希望所有这些组件都正常,而不是,比如说,全为零?您可能还想在 HLSL 代码中将矩阵类型显式设置为“matrix <float, 4, 4>”,或者将变换声明为“float4x4”。

于 2013-01-04T04:32:05.633 回答