1

NVDIA GPU Gems Chapter 9. Efficient Shadow Volume Rendering on iPadに従ってシャドウ ボリュームを実装しようとしていますが、ステンシル バッファーに表示されるフロント/ライト キャップに問題があります。

下の写真の真ん中にあるボックスに影を付けようとしています。影はボックスの右側に正しく生成されていますが、カメラを動かすと、ボックスの照らされた側の一部が影になります。シャドウボリュームがボックスと同じ深さであり、描画されるべきではない場合を認識せず、深度バッファの解像度に問題があるように思えますが、シャドウボリュームglDepthFunc(GL_LESS)の描画に使用しましたこれを修正しようとしても、何も変わらないようです。

ここに画像の説明を入力

これが私のコードの要約です:

glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
glDisable(GL_BLEND);

[self drawAmbient];

glDepthMask(GL_FALSE);
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0, 0xff);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_DECR_WRAP_OES, GL_KEEP);
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_INCR_WRAP_OES, GL_KEEP);

glDisable(GL_CULL_FACE);

[self drawShadowVolumes];

glStencilFunc(GL_EQUAL, 0, 0xff);
glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP);
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP);

glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);

glDepthMask(GL_TRUE);
glDepthFunc(GL_EQUAL);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glEnable(GL_CULL_FACE);

[self drawDirectionalLight];
4

1 に答える 1

0

あなたは何か間違ったことをしています。デフォルトの Z-fail テクニックでは、シャドウ ボリューム レンダリングの 2 つのパスが必要です。1 つは「縮退したクワッド」(シャドウ ボリューム) 用で、もう 1 つはフラット法線 (シャドウ キャップ) を使用した「正確なオブジェクト ジオメトリ」用です。「縮退した四角形」のパスは 1 つしか表示されませんが、ステンシル バッファに反対のフラグがある「正確なジオメトリ」のパスはどこにありますか?

縮退したクワッドは次の方法でレンダリングする必要があります

glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_DECR_WRAP_OES, GL_KEEP); glStencilOpSeparate(GL_BACK, GL_KEEP, GL_INCR_WRAP_OES, GL_KEEP);

正確にジオメトリは、反対のフラグでレンダリングする必要があります

glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_INCR_WRAP_OES, GL_KEEP); glStencilOpSeparate(GL_BACK, GL_KEEP, GL_DECR_WRAP_OES, GL_KEEP);

深度テストは、単純なジオメトリ レンダリングのように GL_LESS または GL_LEQUAL である必要があります。

于 2014-10-17T09:07:40.150 に答える