1

私は現在、GLSL を使用してシャドウンを作成することを学んでいますが、ここでいくつかの問題があります:
1. GLSL 3.3 では、フラグメントシェーダーでこのステートメントを使用できます:

layout(location = 0) out float fragmentdepth;

深度 16 ビットのみをテクスチャに書き出す (GL_DEPTH_COMPONENT16以前のように設定) が、OpenGL 2.1 (GLSL 1.20) でそのようなことを行うにはどうすればよいですか?

  1. 私の知る限り、深度バッファをレンダリングするには、カメラの位置をライトの位置に変更し、カメラの方向をライトの方向に変更するだけで済み、実際のシーンを描画している場合は元に戻す必要があります。それは正しいですか?
4

2 に答える 2

3

GLSL 3.3 では、フラグメント シェーダーで次のステートメントを使用できます。

深度 16 ビットのみをテクスチャに書き込む (以前は GL_DEPTH_COMPONENT16 として設定)

いいえ、できません。

それはカラーバッファfragmentdepthに書き込むように設定されます。また、イメージ形式のイメージをFBO の接続ポイントに添付することはできません。そうしようとするとエラーが発生します。GL_DEPTH_COMPONENT16 GL_COLOR_ATTACHMENTiGL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

GLSL のすべてのバージョンで、アタッチされた深度バッファーに書き込む唯一の方法は、gl_FragDepth. また、 GLSL のすべてのバージョンで、FBO に接続できる深度バッファーは 1 つだけです。Image Load/Storeではそれを回避できますが、深度テストなどは失われます。

于 2013-01-13T19:26:45.377 に答える
1

ここで述べたように、OpenGL 2.1 をターゲットにする場合は、FBO 拡張機能 (EXT) を使用する必要があります。また、なぜ固定パイプラインをまだ使用しているのですか?これは非推奨です。ハードウェアで許可されている場合は、OpenGL 3.3+ を使用してから (コア) FBO を活用します。深度バッファー データを描画できるテクスチャ アタッチメント (またはレンダー バッファー)。

とにかく、これがあなたのバージョンに必要なものです。

于 2013-01-13T13:28:12.693 に答える