我在我的OpenGL代码中面临问题
我正在尝试建造房屋,并将其旋转360°,为简单起见,假设房子的前壁带有窗户和dor和后墙。
我正在使用depth_buffer在查看前墙时不看到后墙,而另一种方式,但是当我旋转房屋时,门和窗户开始摇晃并变形。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
glLoadIdentity();
gluLookAt(0.0, 0.0, 40.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glRotatef(angle, 0.0, 1.0, 0.0);
glEnable(GL_DEPTH_TEST);
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(8.0, 3.0, 0.0);
glVertex3f(8.0, -10.0, 0.0);
glVertex3f(1.0, -10.0, 0.0);
glVertex3f(1.0, 3.0, 0.0);
glEnd();
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(-9.0, -4.0, 0.0);
glVertex3f(-9.0, 3.0, 0.0);
glVertex3f(-2.0, 3.0, 0.0);
glVertex3f(-2.0, -4.0, 0.0);
glEnd();
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(10.0, -10.0, -20.0);
glVertex3f(-10.0, -10.0, -20.0);
glVertex3f(-10.0, 10.0, -20.0);
glVertex3f(10.0, 10.0, -20.0);
glEnd();
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(10.0, -10.0, 0.0);
glVertex3f(10.0, 10.0, 0.0);
glVertex3f(-10.0, 10.0, 0.0);
glVertex3f(-10.0, -10.0, 0.0);
glEnd();
glDisable(GL_DEPTH_TEST);
glutSwapBuffers();
该问题称为Z-tighting。这是引起的,因为"门","窗户"one_answers"墙"的深度相等。Vertiex坐标通过模型视图矩阵和投影矩阵进行转换,并针对多边形覆盖的每个片段插值。这导致最终Z坐标(深度)的不准确性。
在绘制墙壁之前,启用多边形填充偏移(glPolygonOffset
),以解决问题:
glEnable(GL_DEPTH_TEST);
glDisable( GL_POLYGON_OFFSET_FILL );
// draw door and window
// ...
glEnable( GL_POLYGON_OFFSET_FILL );
glPolygonOffset( 1, 1 );
// draw walls
// ...
多边形填充偏移量可操纵片段的深度。这导致"墙"的深度与"窗口"one_answers"门"的深度不同,即使在模型视图和投影矩阵进行转换之后。
由于将偏移添加到"墙"的深度中,因此"墙"总是在窗户和门后面,独立于视野。