首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用模具测试时会出现奇怪的错误。

使用模具测试时会出现奇怪的错误。
EN

Stack Overflow用户
提问于 2018-04-12 01:50:11
回答 1查看 273关注 0票数 3

我正在做一个应用程序,它显示一个地形和一些定制的凹坑,应该插入到地形。要将凹坑插入到地形中,我使用模板测试。它的工作几乎是伟大的,但有一些奇怪的错误存在。

代码:

代码语言:javascript
复制
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

视距离和视角而定,有时坑被地形覆盖。但是当凹坑靠近摄像机时,地势就会从凹坑中消失。

我不知道如何修复这些错误。请帮帮我。所有的答案都会被推翻。

更新:

我最近发现坑被后面的地形覆盖了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-14 14:17:48

为了达到你想要的目的,你要么把场景从后面画到前面。注意,在绘制字体面板之前,几何图形的背面必须清除模具缓冲区。

或者使用脸剔除绘制两次场景。当你先画场景,然后裁剪所有的正面,当你画第二,然后剔除所有的背面。

用这种方式对前后两面使用分离的模具测试,使背面清除模具缓冲区。(见glStencilFuncSeparateglStencilOpSeparate)

渲染过程的工作方式如下:

  • 启用深度测试
  • 禁用颜色缓冲区并启用模板测试以设置模板掩码
  • 画“洞”。这将导致在孔的位置将模具缓冲区设置为1。
  • 设置用于清除模具缓冲区的模具测试
  • 启用前脸的裁剪
  • 画几何图形。这将导致模板缓冲区在几何的背面覆盖的“孔”所在的位置被清除。
  • 为背面的人脸启用裁剪
  • 启用颜色缓冲区
  • 绘制几何图形

要使tha算法工作,您必须按照相同的缠绕顺序绘制所有原语。你必须告诉OpenGL glFrontFace的方向。顺时针方向GL_CW或逆时针方向GL_CCW

代码语言:javascript
复制
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)
// ....
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49786763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档