假设我有2个纹理三角形。 我想在另一个上绘制一个三角形,这样最上面的三角形基本上位于第二个上面。
从技术上讲,它们在同一平面上,但它们不共享相同的“空间”(它们不相交),但在视觉上很难分辨到一定距离。
基本上当这些三角形非常靠近(并行)时,我会看到纹理“神器”。我应该只看到顶部的三角形。但我所看到的是背景中的三角形往往会“流血”。
有没有办法减轻这种副作用,比如增加深度精度还是什么?甚至可能会增加三角形的细分?
*更新*
我正在使用顶点和索引缓冲区。这是在iPhone上使用OpenGL ES。
我不知道这张照片是否会有所帮助或让事情变得更糟。但在这里。两个三角形沿Z轴彼此非常靠近(但不接触)。 (注意:这些三角形的法线向量直接朝向你)。
答案 0 :(得分:2)
您可以将深度精度提高到每像素32位。但是,如果2个三角形是共面的,那么可能无法解决问题。如果它们不是共面的(从你的描述中很难说出你在说什么),那么增加深度精度可能会有所帮助。如果您正在使用FBO进行绘制,只需使用GL_DEPTH_COMPONENT32
作为内部格式,创建每个组件32位的深度纹理。有几个例子here。如果你没有使用FBO,请描述你如何创建你的上下文(你也使用的是什么操作系统--Windows,OS X,Linux?)。
答案 1 :(得分:1)
您可以尝试将Depth Buffer功能更改为更合适的功能......
glDepthFunc(GL_ALWAYS)
- 基本上禁用深度测试
glDepthFunc(GL_GEQUAL)
- 当大于等于
答案 2 :(得分:0)
如果它们太近(假设它们是平行的,而不是在同一平面上),则会出现精度误差(如条带伪影=。尝试使用glPolygonOffsset向顶部多边形添加一些小偏移:http://www.opengl.org/sdk/docs/man/xhtml/glPolygonOffset.xml检查这个简单的教程:http://www.felixgers.de/teaching/jogl/polygonOffset.html
编辑:同时尝试提高精度,因为@ user1118321说。
答案 3 :(得分:0)
您所描述的内容称为Z-Fighting(http://en.wikipedia.org/wiki/Z-fighting)。
遗憾的是,深度缓冲区的精度有限,因此如果两个多边形的深度差异小于深度缓冲区的精度,则无法预测哪个多边形将通过深度测试并被绘制。
正如其他人所说,你可以提高深度缓冲的精度,使多边形在z-fighting伪影出现之前必须彼此更接近,或者你可以禁用深度测试,这样你就可以确保多边形渲染不会被先前绘制的任何东西阻挡。