Java lwjgl平面边界

Java lwjgl平面边界,java,opengl,lwjgl,Java,Opengl,Lwjgl,我想让白色的正方形有蓝色的边框。我做了双平面,但看到这样的结果似乎奇怪的凌乱的白色和蓝色 在3D Java lwjgl中,有没有好方法为正方形创建边框 float d = 1; float f = 1; glColor3f(0, 0, 1); glBegin(GL_QUADS); glVertex3f(-d, f, -f); glVertex3f(-d, -f, -f); glVertex3f(-d, -f, f); glVerte

我想让白色的正方形有蓝色的边框。我做了双平面,但看到这样的结果似乎奇怪的凌乱的白色和蓝色

在3D Java lwjgl中,有没有好方法为正方形创建边框

    float d = 1;
    float f = 1;
    glColor3f(0, 0, 1);
    glBegin(GL_QUADS);
    glVertex3f(-d, f, -f);
    glVertex3f(-d, -f, -f);
    glVertex3f(-d, -f, f);
    glVertex3f(-d, f, f);
    glEnd();

    float d = 1;
    float f = 0.9f;
    glColor3f(1, 1, 1);
    glBegin(GL_QUADS);
    glVertex3f(-d, f, -f);
    glVertex3f(-d, -f, -f);
    glVertex3f(-d, -f, f);
    glVertex3f(-d, f, f);
    glEnd();
奇怪的凌乱的白色和蓝色

听起来像:

Z-fighting,也称为缝合,是3D渲染中的一种现象 当两个或多个基本体在 z缓冲区。在共面多边形中尤其普遍,其中 两个面基本上占据相同的空间,两个面都不在前面。 受影响的像素使用一个多边形或 其他任意的,以由测量精度决定的方式 z缓冲区。它也可以随着场景或摄影机的更改而变化,从而导致 一个多边形“赢得”z测试,然后是另一个多边形,依此类推。总体 效果是两个多边形的闪烁、嘈杂的光栅化 “战斗”给屏幕像素上色。这个问题通常是由 有限的亚像素精度以及浮点和定点 舍入错误


在渲染第二个四边形之前的某个时间,通过glDisable(GL_depth_TEST)禁用深度测试。

您描述的工件听起来像是通常所说的“深度战斗”或“z战斗”。如果在启用深度测试的情况下绘制共面多边形,则会发生这种情况

原因是渲染管道中的所有计算都以有限的精度进行。因此,虽然理论上两个共面多边形在任何给定像素上具有相同的深度,但由于精度/圆角效应,其中一个多边形的深度通常会稍大一些。哪一个稍微靠前可能会在像素之间发生变化,导致典型的伪影

要解决此问题,您有许多选项:

  • 如果你真的不需要深度测试,你可以禁用它。但通常情况下,您确实需要进行深度测试,因此这很少是一种选择

  • 可以对一个多边形应用偏移,使其稍微位于另一个多边形的前面。偏移需要有多大有些棘手,这取决于深度精度和应用的变换。您可以使用各种值,也可以尝试用数学方法分析创建不同深度值所需的输入坐标差异

  • 你可以用。其影响和相关挑战与方案2相当相似。但这会让事情变得更简单,因为你不必自己对坐标应用偏移量

  • 在这样一个简单的例子中,您可以围绕白色正方形绘制一个蓝色框架,而不是绘制一个与白色正方形重叠的整个蓝色正方形。您还需要几个多边形来绘制“框架”形状(看起来像一个大正方形,有一个蓝色正方形大小的孔),但这仍然相当容易绘制,效率更高,并且完全避免了问题