我正在做一个应用程序,它显示一个地形和一些定制的凹坑,应该插入到地形。要将凹坑插入到地形中,我使用模板测试。它的工作几乎是伟大的,但有一些奇怪的错误存在。
代码:
glEnable(GL_STENCIL_TEST);
glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 1, 255);
glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 1, 255);
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glDepthMask(GL_TRUE);
for (Pit3D* pit in pitList) {
[pit render];
}
glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0, 255);
glStencilOpSeparate(GL_FRONT, GL_REPLACE, GL_KEEP, GL_KEEP);
glStencilFuncSeparate(GL_BACK, GL_EQUAL, 0, 255);
glStencilOpSeparate(GL_BACK, GL_REPLACE, GL_KEEP, GL_KEEP);
[terrain render];Bug #1:
当我透过一座小山向坑看时,我看到一些奇怪的阴影或黑点。,虽然我透过另一座小山往下看,但我没有看到那些阴影或斑点。

Bug #2:
当凹坑靠近摄像机时,会出现一些奇怪的像素。它们绝对是属于坑里的,但不应该被看见。
不幸的是我现在还没有截图。它将在今天晚些时候增加。
Bug #3
视距离和视角而定,有时坑被地形覆盖。但是当凹坑靠近摄像机时,地势就会从凹坑中消失。

我不知道如何修复这些错误。请帮帮我。所有的答案都会被推翻。
更新:
我最近发现坑被后面的地形覆盖了。

发布于 2018-04-14 14:17:48
为了达到你想要的目的,你要么把场景从后面画到前面。注意,在绘制字体面板之前,几何图形的背面必须清除模具缓冲区。
或者使用脸剔除绘制两次场景。当你先画场景,然后裁剪所有的正面,当你画第二,然后剔除所有的背面。
用这种方式对前后两面使用分离的模具测试,使背面清除模具缓冲区。(见glStencilFuncSeparate和glStencilOpSeparate)
渲染过程的工作方式如下:
要使tha算法工作,您必须按照相同的缠绕顺序绘制所有原语。你必须告诉OpenGL glFrontFace的方向。顺时针方向GL_CW或逆时针方向GL_CCW。
glStencilMask(0xFF);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glFrontFace(GL_CCW); // depends on your geometry "GL_CCW" or "GL_CW"
glDisable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS); // default
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);
glEnable(GL_STENCIL_TEST);
glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 1, 255);
glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 1, 255);
glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP);
// draw the holes
// ....
glStencilFuncSeparate(GL_FRONT, GL_EQUAL, 0, 255);
glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP);
glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, 255);
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_REPLACE);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
// draw the geometry the 1. time ("draw" back faces)
// ....
glCullFace(GL_BACK);
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
// draw the geometry the 2. time (draw front faces)
// ....https://stackoverflow.com/questions/49786763
复制相似问题