2

OpenGLとGLSLで遅延シェーダーを実装しようとしていますが、ライトのジオメトリに問題があります。これらは私が取っているステップです:

Bind multitarget framebuffer
Render color, position, normal and depth
Unbind framebuffer
Enable blend
Disable depth testing
Render every light
Enable depth testing
Disable blend
Render to screen

しかし、私は前面のみをレンダリングしているので、ライトの中にいると完全に消え、背面のレンダリングは機能しません。これは、光のパワーが2倍になるためです(内部の場合、半分[または通常の量] )。

ライトジオメトリの内側と外側から同じライト値をレンダリングするにはどうすればよいですか?

4

2 に答える 2

3

私の場合は、次のようにします。

Bind gbuffer framebuffer
Render color, position, normal
Unbind framebuffer

Enable blend
Enable depth testing

glDepthMask(0);
glCullFace(GL_FRONT);   //to render only backfaces
glDepthFunc(GL_GEQUAL); //to test if light fragment is "behind geometry", or it shouldn't affect it
Bind light framebuffer
Blit depth from gbuffer to light framebuffer //so you can depth-test light volumes against geometry
Render every light
于 2013-01-19T22:48:28.897 に答える
2

正しく覚えていれば、遅延レンダラーでは、ライトボリュームの背面のみをレンダリングします。欠点は、深度テストができないことです。ライトの計算が行われた後、ライトがジオメトリの背後にあるかどうかしかわからず、ピクセルを破棄します。 別の答えが説明したように、深度テストを行うことができます。裏面がジオメトリの背後にあるか、ジオメトリ上にあるかどうか、つまりジオメトリの表面と交差しているかどうかを確認するために、以上をテストします。

または、レンダリング時にライトボリューム内にいるかどうかを確認し、それに応じて前面を切り替えることもできます。

于 2013-01-19T21:06:21.473 に答える