我遇到的问题是,我的渲染场景中有一些像素 似乎缺少/看不见,因此颜色与我的颜色相同 颜色。有趣的是,只有在关闭MSAA时才会发生这种情况。
我的第一个想法是,它可能与事实有关,即所有三角形都是重叠的,并且不知何故被投影矩阵扭曲,但这些伪像似乎只出现在线而不是边缘上。
我读到只是将1.00001的比例应用于另一个问题的所有内容,但这对我来说似乎是一个可能导致其他问题的廉价黑客。虽然在使用硬件多重采样时这些工件似乎有所减少,但我想知道是否还有其他方法可以解决这个问题。
修改
通过Nicol Bolas解决此问题的方法:
如果边缘完全匹配,OpenGL(和所有其他硬件光栅化器)仅保证两个三角形之间的边缘无间隙渲染。这意味着你不能在另一个边缘旁边有一个三角形。两个三角形在它们之间的共享边上必须具有相同的顶点。
因此,如果短三角形旁边有一个长三角形,您需要做的是将长三角形分成几个三角形,以便在两个三角形之间正确共享边缘的共享部分。
如上所述,一种可能的解决方案是将大三角形分成小三角形以确保所有重叠的椎体相同(即消除贪婪的网格划分)。但就我而言,由于性能方面的原因,我希望保持贪婪的网格划分。
答案 0 :(得分:7)
如果边缘完全匹配,OpenGL(和所有其他硬件光栅化器)仅保证两个三角形之间的边缘无间隙渲染。这意味着你不能在另一个边缘旁边有一个三角形。两个三角形在它们之间的共享边上必须具有相同的顶点。
因此,如果短三角形旁边有一个长三角形,您需要做的是将长三角形分成几个三角形,以便在两个三角形之间正确共享边缘的共享部分。
由于你似乎正在构建一个由立方体组成的世界,这对你来说应该很容易。
您需要做的另一件事是确保两个三角形之间的两个共享顶点是二进制相同。顶点着色器的gl_Position
输出必须是完全相同的值。因此,如果您计算VS中立方体顶点的位置,则需要以保证二进制相同结果的方式进行计算。
但在我的情况下,由于性能方面的原因,我想保持贪婪的网格划分。
然后您需要确定哪个更重要:性能或正确性。因为没有办法强制光栅化器允许这样的边缘无间隙。这是浮点精度等问题,在不同的硬件上总是不同的。
答案 1 :(得分:2)
它被称为"拼接"。光栅化器不完全匹配三角形,并且缺少一些像素。其他人已经解释了如何设置三角形,以便OpenGL知道它们共享和边缘。然而,随着模型构建逻辑变得越来越复杂,有时缝合很难避免。解决方法是清除黑色或深灰色,然后缝线几乎不可见。
答案 2 :(得分:1)
这是因为存在两个多边形接触边缘的问题,但是会出现一些小错误。 (很可能用于估计边缘的浮点单位中的舍入误差)理论上也应该有它们与边缘重叠的时间,但这不太明显。设置一个非常小的放大系数,或只是将多边形本身移动到彼此的一小部分就可以解决它。它仅在MSAA关闭时才会发生,因为它通常有助于防止此类问题。 (这是因为它以更高的分辨率运行所有计算,但随后将所有计算缩减到较低的分辨率,因此它不会那么明显。问题实际上仍然会发生,但由于缩减,丢失的像素将它们会混合到周围的像素中消失。)