椿の日記

たぶんプログラムの話をします

pixel shaderでshared memoryって使えるの?

ここまで最適化を進めてきたのですが、これ以上はpixel shaderでは高速化は無理な気がしてきました…

ループに[unroll]を付けたり階乗計算を漸化式的に書き直したりした結果、アセンブリコードの大半は積和計算になりました。それでも遅いということは、レジスタ数が多すぎるか、定数バッファへのアクセスのレイテンシが大きいのか、そのあたりが問題なのではないかと見ています。

よく知らないのですが、DX11のpixel shader内のcbufferはconstant memory領域に割り振られるのでしょうか? そうだとすると、BRDFや入射光の球面調和係数をshader memory領域に割り振ることで劇的に速くなるかもしれません。

ただ、pixel shaderでshared memoryを使う方法が分かりません…。というか、そもそも使えないのかもしれません。もし使えないとすると、pixel shaderは必要最小限の情報をUAVとかで出力して、それをcompute shaderで処理するのでしょうか。そうなるとdeferred rendering的な形のほうが良いことになるのかなあ。