Rakuten Card
Rakuten
Infoseek
Service
初めて投稿いたします。よろしくお願いします。固定機能からHLSLでの描画に切り替え、陰つけや視差マッピングなどはできたのですが、シャドウマップを実装しようとしたところで、hlsl.fx(193,48): error X5608: Compiled shader code uses too many arithmetic instruction slots (67). Max. allowed by the target (ps_2_0) is 64.とのエラーが出ました。命令数が多すぎるとのエラーかと思うのですが、このエラーの回避方法はございますでしょうか?(現在VertexShader、PixelShader共に2.0を使っており、低スペック方にも遊んでもらいたいと思っているため、これより上位のバージョンにあげる以外の方法で回避したいと思っております。)設定等で多くすることは出来ず、techniqueのPASSを増やして、複数回に分けてシェーダを通すと回避できるのだろうかと推測して、試していたのですが、PASS間でのデータの受け渡しがよく分からず上手くいっておりません。このエラーの回避方法と、その回避方法について書かれたホームページや書籍についてお教え願えないでしょうか。よろしくお願いいたします。
命令数というのがHLSL自体の命令数ではないという事は理解していますでしょうか?条件分岐をしているところを計算に置き換えられれば、結構命令が減ると思いますよ。また、PASS間のデータ受け渡しですが、PASS1の頂点シェーダ(VS)での計算結果をPASS2のVSにわたす事が出来ると考えていたら間違いです。PASS1で描いた画像とPASS2で描いた画像を最終的に合成するような形でマルチパス描画は行われます。
おさん、レスありがとうございます。> 命令数というのがHLSL自体の命令数ではないという事は理解していますでしょうか?> 条件分岐をしているところを計算に置き換えられれば、結構命令が減ると思いますよ。コーディング行数が多すぎてGPUに乗り切らない、ということかと思っていたのですが、理解が間違っていますでしょうか?条件分岐は多いと思うので見直してみたいと思います。しかし、まだまだ被写界深度やキューブマップ、ブルーム、2.5Dブラーなどやってみたいと思っていたものが多数あるのですが、この程度で限界だと、条件分岐を見直しても到底乗り切るとは思えません。本などには各テクニックのコードは載っているのですが、ひとつのゲームとして、HLSLのコードをどのように書くのかといった例を見つけることができていません。多くのシェーダが適用されているゲームなどは皆さんどのように書かれているのか疑問に思っております。このような部分について書かれた書籍やホームページなどはございませんでしょうか?> また、PASS間のデータ受け渡しですが、PASS1の頂点シェーダ(VS)での計算結果を> PASS2のVSにわたす事が出来ると考えていたら間違いです。> PASS1で描いた画像とPASS2で描いた画像を最終的に合成するような形で> マルチパス描画は行われます。 ありがとうございます。ひとつ疑問が解けました。ネット上で調べているときにマルチパスレンダリングという単語をみつけて、そのことかとも思ったのですが、そのページの例ではPASSは複数使わず、レンダリングターゲット複数もつことが挙げられていたので、HLSLに書くPASSとは別物かと思っておりました。
> おさん、レスありがとうございます。> > > 命令数というのがHLSL自体の命令数ではないという事は理解していますでしょうか?> > 条件分岐をしているところを計算に置き換えられれば、結構命令が減ると思いますよ。> > コーディング行数が多すぎてGPUに乗り切らない、ということかと> 思っていたのですが、理解が間違っていますでしょうか?> > 条件分岐は多いと思うので見直してみたいと思います。> > しかし、まだまだ被写界深度やキューブマップ、ブルーム、2.5Dブラーなど> やってみたいと思っていたものが多数あるのですが、この程度で限界だと、> 条件分岐を見直しても到底乗り切るとは思えません。> 本などには各テクニックのコードは載っているのですが、> ひとつのゲームとして、HLSLのコードをどのように書くのかといった例を> 見つけることができていません。> 多くのシェーダが適用されているゲームなどは皆さんどのように書かれているのか疑問に思っております。> このような部分について書かれた書籍やホームページなどはございませんでしょうか?> > > また、PASS間のデータ受け渡しですが、PASS1の頂点シェーダ(VS)での計算結果を> > PASS2のVSにわたす事が出来ると考えていたら間違いです。> > PASS1で描いた画像とPASS2で描いた画像を最終的に合成するような形で> > マルチパス描画は行われます。> > ありがとうございます。ひとつ疑問が解けました。> ネット上で調べているときにマルチパスレンダリングという単語をみつけて、> そのことかとも思ったのですが、そのページの例ではPASSは複数使わず、> レンダリングターゲット複数もつことが挙げられていたので、> HLSLに書くPASSとは別物かと思っておりました。> 書籍などではSM2.0で実装していたので、組み合わせてもそれで実装できるものと思っていたのですが、DirectX9.0Cの対応がSM3.0以上で、自分がやりたいと思っていることをやっているソフトはDirectX9.0C以上だったので、そもそも、SM2.0でそれだけの盛り込むことが無謀だと思えてきました。SM3.0にするとエラーが出なくなったのでそれでいこうと思います。しかし、ハーフライフ2などはSM2.0世代のゲームだと思うのですが、バンプマッピングに鏡面反射、影もついているのでやり方次第では、それなりに盛り込むことも可能なのですね。
> > コーディング行数が多すぎてGPUに乗り切らない、ということかと> > 思っていたのですが、理解が間違っていますでしょうか?間違っています。実際にコーディングしたHLSLの行数ではなく、コンパイル後の命令数ですね。SM2.0だと使える命令数が結構少なくなっていたと思います。ちょうどいい書籍やサイトなどは知りませんが、いろいろな機能を盛り込みたいのでしたらマルチパスで行うしかないと思いますよ。