3

GPUの1Dテクスチャに多くの位置と方向が保存されています。それらをGLSLジオメトリシェーダーのレンダーソースとして使用したいと思います。これを行うには、これらのテクスチャから対応するビューマトリックスを作成する必要があります。

私の最初の考えは、CPUに迂回し、テクスチャをメモリに読み取り、そこからのようなものを使用して一連のビューマトリックスを作成することですglm::lookat()。次に、行列を均一変数としてシェーダーに送信します。

私の質問は、この迂回をスキップして、代わりにGLSLジオメトリシェーダーで直接ビューマトリックスを作成することが可能かどうかです。また、これは実行可能なパフォーマンスの面でしょうか?

4

3 に答える 3

1

もちろん。テクスチャを読み取り、値から行列を構築します...

vec4 x = texture(YourSampler, WhateverCoords1);
vec4 y = texture(YourSampler, WhateverCoords2);
vec4 z = texture(YourSampler, WhateverCoords3);
vec4 w = texture(YourSampler, WhateverCoords4);
mat4 matrix = mat4(x,y,z,w);

これに問題はありますか?それとも私は何かを逃しましたか?

于 2011-10-18T17:48:59.757 に答える
-2

ビュー マトリックスはユニフォームであり、ユニフォームはレンダリング バッチの途中で変更されず、シェーダーから (直接) 書き込むこともできません。少なくとも直接的には、それをどのように生成できるかわかりません。

また、頂点がモデル ビュー マトリックスで変換された後にジオメトリ シェーダーが実行されるため、そのマトリックスまたはその一部を再生成しても (少なくとも同じパス中に) あまり意味がないことに注意してください。

もちろん、変換フィードバックを使用していくつかの値をバッファーに書き込み、後でこれを均一バッファーとしてコピー/バインドするか、シェーダー内から値を読み取ってマトリックスとして乗算することもできます。これにより、少なくとも CPU へのラウンドトリップを回避できます。問題は、そのようなアプローチが理にかなっているかどうか、そして本当にそのようなあいまいなことをしたいかどうかです。達成したいことを正確に把握しないと、何が最善かを判断するのは困難ですが、頂点シェーダーで変換する (これらのテクスチャを読み取り、マトリックスを構築し、乗算する) だけで、より適切かつ簡単に機能する可能性があります。

于 2011-10-18T11:08:14.637 に答える