opengl - 在绘制网格表面和多边形边缘时如何避免 OpenGL 中的 z-fighting?
问题描述
考虑下图:
它具有可视化的网格表面和多边形边缘。更重要的是,即使边缘和面在绘制它们的位置上应该具有相同的 z 坐标并导致z-fighting,在此图像中,只要多边形边缘没有被 (不相邻的)多边形,并且没有可见的 z-fighting。这如何在 OpenGL 中实现?
解决方案
我通常只在要渲染到的帧缓冲区上启用一些 MSAA,然后执行以下操作:
glDepthFunc(GL_LESS);
drawShadededMesh();
glDepthFunc(GL_LEQUAL);
drawWireMesh();
在大多数情况下,这通常效果很好。如果做不到这一点(如评论中所述),您可以尝试使用 glPolygonOffset。
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1.0, 1.0); ///< may need adjustment for your use case
glDepthFunc(GL_LESS);
drawShadededMesh();
glDisable(GL_POLYGON_OFFSET_FILL);
glDepthFunc(GL_LEQUAL);
drawWireMesh();
推荐阅读
- python - Pip 无法安装 tensorflow,因为它不存在
- import - 虚拟机导入后的谷歌云根驱动器上没有可用空间
- dialogflow-es - Dialogflow - 无法访问麦克风
- javascript - SortableJS - 防止列表项被移动到另一个列表
- python - 基于另一个小部件显示/隐藏散景小部件
- python - 为 mariadb 和 postgres 数据库启用 ssl 会导致服务器过载或影响性能吗?
- php - 删除 Laravel 包路由并添加新的
- python-3.x - 如何从单词之间提取文件路径?
- python - 遍历嵌套在列表中的元组,并根据日期为每个元组组选择前 1 个
- spring-data-jpa - 将特定查询转换为 JPQL 或 Criteria Builder 查询