XNAのファイルからシェーダーを動的にコンパイルして実行します
-
26-09-2019 - |
質問
ファイルからピクセルシェーダーを動的にコンパイルし、メッシュに適用する可能性があるかどうか疑問に思っています。
まず、背景情報から始めます。私は、質問にとってあまり重要ではないさまざまなデータに基づいてHLSLピクセルシェーダーを作成するシステムを持っています。重要なのは、これらのシェーダーがテクニックやパスを使用しないことです。それらは.fxファイルとして使用されることを意図していないためです。
ShaderCompiler.CompileFromFile()
メソッドはファイルを正常にコンパイルすることができます CompiledShader
.
このシェーダーをメッシュに適用することは可能ですか?
私は各ファイルのエントリポイントを見つけたくないので、それをテクニックにラップして、それをとしてコンパイルすることができます Effect
.
解決
まず第一に - シェーダーにエントリポイントがない場合、実際には何もコンパイルしていません! 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で効果を使用する必要があり、XNA 3.1に効果とPixelShaderの使用の間にあまり違いはないことを考えると、効果を使用して、コンパイルしてください。 Effect.CompileEffectFromSource
, 、使用する代わりにXNA 3.1にとどまることを選択した場合 ShaderCompiler
)