4

ファイルからピクセルシェーダーを動的にコンパイルしてメッシュに適用できるかどうか疑問に思っています。

まず、いくつかの背景情報から始めます。私は、質問にとってそれほど重要ではないデータの範囲に基づいて HLSL ピクセル シェーダーを作成するシステムを持っています。重要なのは、これらのシェーダーがテクニックやパスを使用しないことです。.fx ファイルとして使用することを意図していないためです。

このShaderCompiler.CompileFromFile()メソッドは、ファイルを正常にコンパイルしてCompiledShader.

このシェーダーをメッシュに適用することは可能ですか?

各ファイルのエントリポイントを見つけて、.xmlファイルとしてコンパイルできるようにする手法でラップしたくないのでEffect

4

1 に答える 1

6

まず第一に、シェーダーにエントリ ポイントがない場合、実際には何もコンパイルしていません! HLSL 関数 (あなたが作業しているように聞こえます) は、エントリ ポイントからインライン展開されます。エントリ ポイントがない場合、得られるのは空のシェーダーです。

(これは、コンパイル後に結果のシェーダーを逆アセンブルすることで確認できます。手順については、この質問と回答を確認してください。)

まず、テクニック ラッパーを生成するコードを作成する必要があります。ソースを大まかに解析して関数名を見つけるのはそれほど難しくありません。ソースをバッファにロードし、生成されたテクニック宣言を追加できます。次に、そのバッファから作成したバージョンの を使用しShaderCompiler.CompileFromFileます。Stream

このシェーダーをグラフィックス カードに設定するには、XNA 3.1 で次を使用できます。

CompiledShader cs = ShaderCompiler.CompileFromFile(...);
PixelShader ps = new PixelShader(graphicsDevice, cs.GetShaderCode());
graphicsDevice.PixelShader = ps;

XNA のビルトイン メッシュを使用する場合はModelMeshPart.Draw、メッシュを描画するために使用します。Modelこれにより、のビルトイン エフェクトがすべてバイパスされます。

ShaderCompiler, CompiledShader,PixelShaderシステム全体が XNA 4.0 で XNA から削除されたことは指摘しておく価値があります。これについては、こちらで説明しています。XNA 4.0 でエフェクトを動的にコンパイルする方法については、こちらで説明しています

(XNA 4.0 では Effect を使用する必要があり、XNA 3.1 では Effect と PixelShader の使用に大きな違いはないことを考えると、Effect.CompileEffectFromSourceXNA 3.1 にとどまることを選択した場合は、 を使用する代わりに、でコンパイルして Effect を使用することをお勧めしますShaderCompiler)

于 2010-09-02T06:24:22.450 に答える