3

以下の質問を複数の質問に分割するよう求められました。

HLSL と Pix の問題数

これは最初の質問です。HLSL 3 で、頂点シェーダーなしでピクセル シェーダーを実行できますか。HLSL 2 ではできると思いますが、3 では方法が見つからないようです。

シェーダーは正常にコンパイルされますが、SpriteBatch Draw() を呼び出すと、Visual Studio からこのエラーが発生します。

「シェーダー モデル 3.0 を以前のシェーダー モデルと混在させることはできません。頂点シェーダーまたはピクセル シェーダーのいずれかが 3.0 としてコンパイルされている場合、それらは両方である必要があります。」

シェーダーで 3 より前の何かを使用するように定義したとは思えません。そのため、少し混乱しています。どんな助けでも大歓迎です。

4

2 に答える 2

7

問題は、組み込みのSpriteBatchシェーダーが 2.0 であることです。ピクセル シェーダのみを指定した場合SpriteBatchでも、組み込みの頂点シェーダが使用されます。したがって、バージョンの不一致。

したがって、解決策は、頂点シェーダーも自分で指定することです。幸いなことに、Microsoft はXNA の組み込みシェーダーのソースを提供しています。関係するのは、マトリックス変換だけです。直接使用できるように変更されたコードを次に示します。

float4x4 MatrixTransform;

void SpriteVertexShader(inout float4 color    : COLOR0,
                        inout float2 texCoord : TEXCOORD0,
                        inout float4 position : SV_Position)
{
    position = mul(position, MatrixTransform);
}

そして、あなたのためSpriteBatchにそれを設定しないので、あなたの効果をMatrixTransform正しく設定します。これは、「クライアント」空間の単純な投影です (ソースはこのブログ投稿から)。コードは次のとおりです。

Matrix projection = Matrix.CreateOrthographicOffCenter(0, 
        GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, 0, 0, 1);
Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0);
effect.Parameters["MatrixTransform"].SetValue(halfPixelOffset * projection);
于 2013-02-09T04:36:54.383 に答える