5

ちなみに、私はすべてのRastertek DirectXチュートリアルを実行していますが、これらは非常に優れており、作成者はさまざまな目的で複数のシェーダーを使用する傾向があります。後のチュートリアルの1つで、彼はシェーダーマネージャークラスも紹介しています。

他のいくつかの情報源に基づいていますが、代わりに複数の手法で単一のシェーダーを使用する方が効率的であると思います。チュートリアルの複数のシェーダーは単純化のために使用されていますか、それとも複数のシェーダーを使用する方が単一の大きなシェーダーよりも優れているシナリオがありますか?

4

3 に答える 3

4

チュートリアルでは、簡単にするためにそれらを使用していると思います。

それらを技術にグループ化するか、個別にグループ化することは、設計上の決定です。複数のシェーダーを使用すると、好きなように組み合わせることができるため、有益なシナリオがあります。

Windows8のDirectX11以降、D3DXライブラリは非推奨になっているため、変更されていることがわかります。この例は、DirectXツールキットのソースコード(http://directxtk.codeplex.com/)と、それらがどのように効果を処理したかで確認できます。

通常、メモリにはさまざまなVertex Shader、PixelShaderなどがあります。テクニックはそれらを1つに結合する傾向があるため、シェーダーファイルをコンパイルすると、そのテクニックのために特定の頂点シェーダーとピクセルシェーダーがコンパイルされます。エフェクトオブジェクトは、Yパスを使用したXテクニックが選択されたときに、デバイスが設定されている頂点/ピクセルシェーダーを処理します。

これは手動で行うことができます。たとえば、ピクセルシェーダーをコンパイルしてデバイスに設定するだけです。

于 2013-01-11T03:50:52.010 に答える
4

主に答えは次のようになります:それは異なります。

エフェクトフレームワークには、Pass-> Applyを使用してパイプライン全体を一度に設定できるという大きな利点があります。これにより、作業が非常に簡単になりますが、適切に使用しないとコードがかなり遅くなる可能性があります。これが、Microsoftが廃止することを決定した理由です。 、しかし、複数のシェーダーを使用して、同じように、またはさらに悪いことを行うことができます。directxtkは、実際にはそのかなり良い例です(電話の開発でのみ問題ありません)。

ほとんどの場合、エフェクトフレームワークでは、個別のシェーダーの使用を回避できるいくつかの追加のAPI呼び出しが発生します(描画呼び出しバウンドが重要になる可能性がある場合は同意しますが、カリング/インスタンス化手法を使用してその部分を最適化することを検討する必要があります)。個別のシェーダーを使用すると、すべての状態/定数バッファー管理を自分で処理する必要があります。自分が何をしているのかがわかっている場合は、おそらくより効率的な方法で処理する必要があります。

fxフレームワークについて私が本当に気に入っているのは、非常に優れた反射と、設計段階で非常に役立つセマンティクスの使用です(たとえば、float4x4 tP:PROJECTIONを実行すると、エンジンはカメラの投影をシェーダーに自動的にバインドできます)。

また、シェーダーステージ間のコンパイル時のレイアウト検証は、オーサリングに非常に便利です(fxフレームワーク)。

個別のシェーダーの大きな利点の1つは、必要なステージのみを簡単に交換できるため、パイプラインの残りの部分に触れることなく、適切な量の順列を節約できることです。

于 2013-01-20T13:10:06.637 に答える
0

複数のfxファイルをロードすることは決して良い考えではありません。可能であればfxファイルを結合し、VInput構造体に含める必要がない場合は可能であればグローバルを使用します。

このようにして、必要なエフェクトを取得し、独自のシェーダークラスで設定したものを渡して、残りを処理することができます。これには、テクニックパスが含まれます。

自分で抽象ShaderClassと抽象ModelClassを作成します。

より正確には、モデルとは別に、Graphicsクラス内でシェーダーを初期化します。texture.fxファイルを使用してTextureShaderクラスを作成する場合、その別のインスタンスを初期化する必要はありません。むしろ、TextureShaderオブジェクトを適切なモデルと共有してから、必要に応じて仮想を使用してShaderポインターと(任意の)Modelポインターの両方を保持するRenderer構造体/クラスを作成します。

于 2014-07-14T18:50:46.780 に答える