1

スクリーン スペース ポイントをビュー スペースに投影して照明で使用することにより、ポジション バッファの使用を回避しようとしています。逆投影行列を掛けてみましたが、これはビュー スペース ポイントを返しません。位置バッファーを回避するために行列乗算を追加する価値はありますか?

最終パス シェーダー:

vec3 ScreenSpace = vec3(0.0,0.0,0.0);
ScreenSpace.xy = (texcoord.xy * 2.0) - 1.0;
ScreenSpace.z  = texture2D(depthtex, texcoord.xy);
vec4 ViewSpace = InvProjectionMatrix * vec3(ScreenSpace, 1.0);
ViewSpace.xyz = ViewSpace.w;
4

1 に答える 1

3

あなたの答えのほとんどはこの答えで見つけることができます、それは長すぎて再投稿するのに関与します。ただし、問題の一部は、を使用していることであり、を使用texcoordしていないことですgl_FragCoord

を使用する必要がありますgl_FragCoord。これは、OpenGLによって正しい値であることが保証されているためです(遅延パスと照明パスが同じサイズの画像を使用していると仮定します)。また、頂点シェーダーからフラグメントシェーダーに値を渡す必要がなくなります。

欠点は、それを解釈するために出力画面のサイズが必要になることです。しかし、2つのパスが同じサイズの画像を使用していると仮定すると、これは非常に簡単です。

ivec2 size = textureSize(depthtex, 0);

sizeビューポートのサイズに使用して、gl_FragCoord.xyテクスチャ座標とウィンドウスペースの位置に変換できます。

于 2013-02-04T22:57:01.230 に答える