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];