none
DirectX11でSM3.0シェーダーの生成が出来ない RRS feed

  • 質問

  • DirectX11にてSM3.0のシェーダーを生成したいと考えております。

    fxc.exeにてターゲットをvs_3_0にてコンパイル後、データをランタイムで読み込み

    ID3D11Device::CreatVertexShaderにて生成を試みると

    戻り値としてE_INVALIDARGが帰ってきておりエラーとなっています。

    SM4.0でコンパイルした際は問題なく生成に成功しているのですが(SM3.0からセンマンティクスなどに変更有)

    SM3.0使用する際(使用するSMを変える際)には、Device初期化時などになんらかの設定が必要だったりするのでしょうか?

    以上、

    よろしくお願い致します。

    2012年8月10日 5:51

回答

  • 長期間放置されているスレッドで、質問者の人はすでに見てないと思いますが、2017年現在でもわりとDirectX 11 (Direct3D 11) アプリケーション開発者にとっては有用だと思われるので他の閲覧者のためにも記載しておきます。

    Direct3D 10.x/11.xではシェーダーモデル3.0を使用することができません。ただし、ダウンレベルのシェーダープロファイルすなわち下記のDirect3D 10.x/11.x API向けシェーダープロファイルを指定してコンパイルすることで、シェーダーモデル2.0を利用することはできます。

    vs_4_0_level_9_0, vs_4_0_level_9_1, vs_4_0_level_9_3

    ps_4_0_level_9_0, ps_4_0_level_9_1, ps_4_0_level_9_3

    Direct3D機能レベルとシェーダーモデル(シェーダープロファイル)の関係は以下に記載してあります。ただし、level_9_0に関しては説明がないようです。

    Direct3D feature levels (Windows)

    つまり、Direct3D 10.x/11.x APIでは、SM4.0は満たさないがSM3.0を満たすDirectX 9.0c世代のハードウェア上にて、SM2.0までの機能は使えるものの、SM3.0の機能を使うことはできません。ダウンレベルのシェーダープロファイルでSM2.0を使うか、それともSM4.0以上を使うか、のどちらかです。SM4.0はSM3.0のスーパーセットであり、SM3.0の機能はすべて利用可能なので、DirectX 9.0cまでしか対応していないような古いGPUをターゲット動作環境に入れる必要がないのであれば、SM4.0を使うことで対処できます。どうしてもDirectX 9.0cまでしか対応していない古いGPUでSM3.0を使いたければ、Direct3D 9/9Exを使うほかありません。

    なお、fxc.exeにて後方互換モードを有効にする/Gecコンパイルオプションを指定することで、旧仕様の文法・セマンティクスを使ったHLSLコードをコンパイルすることは可能ですが、よほどのこと(膨大な旧HLSLコード資産があるなど)がないかぎり使わないほうがよいです。

    2017年3月26日 9:51