python - GL_LINES 没有在 GL_QUADS 周围正确绘制(可能是 z-fight?)
问题描述
我有三个绘制曲面的基本函数,第一个是绘制曲面;
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_)`
任何想法如何修复出现在白色表面上的黑线?
解决方案
当要在帧缓冲区 FB 中设置片段(将其视为像素)时(窗口的上一步),OpenGL 将其 Z 坐标与当前的 Z 坐标进行比较,以获得相同的 X、Y NDC 坐标(那些FB)。
默认情况下,如果传入的 Z 小于当前的 Z(它更靠近相机),则它获胜并替换 FB 中的旧颜色。这样,另一个片段后面的片段被丢弃。
何时碎片具有相似的 Z 坐标,尚不清楚谁领先。有时,由于数值浮点数不精确,最近的片段“丢失”并错误地被丢弃。这被称为“z 战斗”。
如果你想看到一些东西,尽管它在其他图元的前面或后面,你可以将glDepthFunc更改为GL_ALWAYS
.
所以:
- 画出你的表面
- 放
glDepthFunc(GL_ALWAYS)
- 画出你经常看到的物体
- 恢复
glDepthFunc
正常的“GL_LESS”
推荐阅读
- grafana - 我可以使用“转换”或类似的东西来计算来自两个不同数据库的结果吗?
- android - Firebase Crashlytics with chromium (android)
- javascript - 需要将文件路径数组转换为treeview json对象
- python - 如果python解释器在遇到错误时立即停止执行,那么如何生成2条不同的错误消息?
- sql - SQL Select 不重复,并有条件地选择要保留的正确重复
- asp.net-core - 重新启动 IIS 网站后,Blazor 服务器端应用程序不会重定向到登录页面
- javascript - XPages 在按钮单击时创建一个新文件夹
- c++ - 如何修复错误“表达式必须具有指向对象类型”(多文件项目)?
- java - Spring JPA 数据 - 保存方法不会更新
- nginx - nginx 代理通行证:斜杠,vars 不起作用