0

假设我有 2 个带纹理的三角形。我想在另一个上画一个三角形,这样顶部的三角形基本上就在第二个的上面。

现在从技术上讲,它们在同一平面上,但它们不共享相同的“空间”(它们不相交),尽管在一定距离上很难分辨。

基本上,当这些三角形非常靠近(平行)时,我会看到纹理“伪影”。我应该只看到顶部的三角形。但我看到的是背景中的三角形倾向于“流血”。

有没有办法减轻这种副作用,比如提高深度精度之类的?甚至可能增加三角形的镶嵌?

* 更新 *

我正在使用顶点和索引缓冲区。这是在 iPhone 上使用 OpenGL ES。

我不知道这张照片是否会帮助或使事情变得更糟。但在这里。沿 Z 轴彼此非常靠近的两个三角形(但不接触)。(注意:这些三角形的法线向量直接朝向您)。 在此处输入图像描述

4

4 回答 4

2

您可以将深度精​​度提高到每像素 32 位。但是,如果 2 个三角形共面,那可能无法解决问题。如果它们不是共面的(从您的描述中很难分辨出您在说什么),那么增加深度精度可能会有所帮助。如果您使用 FBO 进行绘图,只需使用GL_DEPTH_COMPONENT32内部格式创建每个组件 32 位的深度纹理。这里有几个例子。如果您不使用 FBO,请描述您如何创建上下文(以及您使用的操作系统 - Windows、OS X、Linux?)。

于 2013-05-05T06:16:56.720 回答
1

您可以尝试将深度缓冲区功能更改为更合适的功能...

glDepthFunc(GL_ALWAYS)- 基本上禁用深度测试

glDepthFunc(GL_GEQUAL)- 大于或等于时覆盖

于 2013-05-05T08:08:00.560 回答
0

如果它们太近(假设它们是平行的,而不是在同一平面上),您将得到精度错误(例如条带伪影=。尝试使用 glPolygonOffsset 向顶部多边形添加一些小偏移:http ://www.opengl.org /sdk/docs/man/xhtml/glPolygonOffset.xml检查这个简单的教程:http ://www.felixgers.de/teaching/jogl/polygonOffset.html

编辑:也尝试像@user1118321 所说的那样提高精度。

于 2013-05-05T07:54:32.133 回答
0

您所描述的称为 Z-Fighting ( http://en.wikipedia.org/wiki/Z-fighting )。

遗憾的是,深度缓冲区的精度有限,因此如果两个多边形的深度差小于深度缓冲区的精度,则无法预测哪个多边形将通过深度测试并被绘制。

正如其他人所说,您可以提高深度缓冲区的精度,以便在发生 z 冲突伪影之前多边形必须彼此靠近,或者您可以禁用深度测试,以确保渲染的多边形不会被阻止以前画的任何东西。

于 2013-05-06T02:51:10.777 回答