2016-11-30 19 views
2

私はHLSL内の配列の長さを取得する方法上の任意のドキュメントや例を見つけることができません。HLSLの配列の長さは?

私は、HLSLシェーダへのライトの配列をプッシュし、私はfor(int i=0; i<foo.length; i++)やりたい( - 正しくない構文が)。

は、配列の長さを得ることができないのか? C++側からhlslシェーダに配列の長さの整数をプッシュする必要がありますか?

はまた、どのように私は私のシェーダーに持つことができる最大許容forループ回数だものを見つけることができますか? (ループが展開されるので、制限があるはずです)

答えて

2

私が知る限り、定義済みの長さ(Array syntax needs a positive integer as size)の配列を宣言する必要があります。この固定配列をexternから任意の量のデータで埋めると、HLSLはこれについて知る方法がありません。したがって、配列の長さをシェーダに渡す必要があります。

シェイダーモデル3.0+で作業していて、以前に[unroll]を指定していない場合、ループは自動的には展開されません。 (doc

何の属性は、コンパイラは最初のループのロールバージョンを放出しようとすると、それが失敗した場合にループがアンロールされた場合、一部の操作が容易になるだろう場合、または、にフォールバックします指定されていない

ループのアンロールされたバージョン。

だからである何の最大許容ループ回数ませんが、ご使用シェーダーモデルに依存し、最大実行命令数(wiki)があり、さらに、それはより多くを必要とする場合は、あなたのグラフィックデバイスをリセットするウィンドウのウォッチドッグがあります無限ループなどでレンダリングする場合は2秒(doc)。

+0

これはかなり意味があります。 hlsl配​​列は、魔法のように長さの値を保持する構造体ではありません。私の場合は、シェーダコードの「魔法」と目に見えないものを、特定の配列が利用できるようにUnrealのエンジンのC++側を経由してシェーダにリソースを送っていました。 – Spectraljump