1

みなさん、こんにちは。エンジンをdirectx11に変換するために再コーディングを開始しました。現在、基本を機能させようとしていますが、このエラーが原因で本当に停止しています。基本的なシェーダー、法線とビューの単純な内積を作成しました。エラーなしでコンパイルできましたが、機能しません。入力メッシュを完全に変形するだけです。vs2012でデバッグを開始し、ピクセルシェーダーがすべてのNaNを入力として取得していることを確認しました。2つの画面とシェーダーコードを添付しました。誰かがアイデアを提供できれば、それは本当に魅力的です。

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

CPU側で行列を転置する代わりに、シェーダーで#pragma pack_matrix(row_major)を使用できます。

于 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行列を1つに連結してみてください。うまくいけば、それらのコンポーネントのすべてが大丈夫でした、たとえば、すべてゼロではありませんか?また、HLSLコードで行列タイプを「matrix <float、4、4>」として明示的に設定するか、変換を「float4x4」として宣言することもできます。

于 2013-01-04T04:32:05.633 に答える