我具有绘制表面的三个基本功能,第一个是绘制表面;
def deflected_3d_surface(self, array):
glBegin(GL_QUADS)
for d in range(int(array.shape[0] / 2 - 1)):
glColor4f(1, 1, 1, 1)
glVertex3fv(array[2 * d + 2, :])
glVertex3fv(array[2 * d, :])
glVertex3fv(array[2 * d + 1, :])
glVertex3fv(array[2 * d + 3, :])
glEnd()
第二个绘制该表面的外边缘;
def deflected_3d_edges(self, array2):
glBegin(GL_LINES)
for i in range(array2.shape[0] - 1):
glColor3fv((0, 0, 0))
glVertex3fv(array2[i, :])
glVertex3fv(array2[i + 1, :])
glEnd()
第三个是在该表面上绘制线条; (请注意,线顶点和表面顶点不相同)
def deflected_3d_inner_edges(self, x_array, y_array, z_array):
glBegin(GL_LINES)
for i in range(x_array.shape[0]):
glColor3fv((0, 0, 0))
glVertex3fv([x_array[i, 0], y_array[i, 0], z_array[i, 0]])
glVertex3fv([x_array[i, 1], y_array[i, 1], z_array[i, 1]])
if x_array.shape[1] != 2:
glVertex3fv([x_array[i, 1], y_array[i, 1], z_array[i, 1]])
glVertex3fv([x_array[i, 2], y_array[i, 2], z_array[i, 2]])
glEnd()
当我按以下顺序调用这些函数时;
`glWidget.deflected_3d_edges(self, self.tf1_edges_array)
glWidget.deflected_3d_edges(self, self.tf2_edges_array)
glWidget.deflected_3d_edges(self, self.bf1_edges_array)
glWidget.deflected_3d_edges(self, self.bf2_edges_array)
glWidget.deflected_3d_inner_edges(self, self.xbcr_, self.ybcr_,
self.zbcr_)
glWidget.deflected_3d_inner_edges(self, self.xwcr_, self.ywcr_,
self.zwcr_)
glWidget.deflected_3d_inner_edges(self, self.xtcr_, self.ytcr_,
self.ztcr_)`
有什么想法可以解决出现在白色表面上的黑线吗?
答案 0 :(得分:0)
当要在帧缓冲区FB(窗口的上一步)中设置一个片段(以像素为单位)时,对于相同的X,Y NDC坐标,OpenGL将其Z坐标与当前坐标进行比较(那些)。
默认情况下,如果传入的Z小于当前的Z(距离相机更近),则它会获胜并替换FB中的旧颜色。这样一来,另一个片段之后的片段就被丢弃了。
当片段具有相似的Z坐标时,尚不清楚谁领先。有时,由于数值上的浮动不精确性,最近的片段“丢失”并错误地被丢弃。这就是所谓的“ z战”。
如果您想看到某些东西,尽管它位于其他图元的正面或背面,则可以将glDepthFunc更改为GL_ALWAYS
。
所以:
glDepthFunc(GL_ALWAYS)
glDepthFunc
恢复为正常的'GL_LESS`