美文网首页
OpenGL: 正背面剔除

OpenGL: 正背面剔除

作者: 番茄炒西红柿啊 | 来源:发表于2020-07-16 11:13 被阅读0次

案例分析

1.用平面着色器绘制一个环并旋转, 效果如下:

一切看似没有问题.

2.再用光源着色器绘制一个立体环并旋转, 效果如下:

可以明显的发现旋转过程中出现了我们并不想看到的现象, 环中部分地方出现了黑色模块.

我们知道,当光照射一个物体的时有正光面和背光面.上图绘制的环我们可以理解成有颜色的那一面就是正光面,黑色就是背光面.

立体环在旋转渲染的过程中, 能够被观察者看到的正面和不能被观察者看到的背面都被渲染了出来.所以便出现了上图中的现象.

对于观察者不可见的部分,OpenGL是支持丢弃这部分数据的, 可以提高50%的渲染性能.

正背面剔除方案

  • 打开正背面剔除:
glEnable(GL_CULL_FACE);
  • 关闭正背面剔除:
glDisable(GL_CULL_FACE);
  • 可以设置需要剔除的面
void glCullFace(GLenum mode);
mode 作用
GL_FRONT 剔除正面 (当不手动设置时, 这个是默认值)
GL_BACK 剔除背面
GL_FRONT_AND_BACK 剔除正背面
  • 修改正反面 (不建议修改此规则)
void glFrontFace(GLenum mode);
mode 作用
GL_CW 顺时针为正面
GL_CCW 逆时针为正面 (默认值)

这里顺时针/逆时针指的是顶点的连接顺序. 默认情况下我们认为逆时针连接的为正面, 顺时针连接的为背面. 这是约定的规则. 所以不建议调用glFrontFace来手动修改规则. 开发者都遵循一套默认的规则就好.

  • 如上图, 当观察者在右侧时, 右边的灰色三角形顶点连接方式逆时针1 - 2 - 3为正面, 左边的三角形顶点连接方式顺时针1 - 2 -3为背面.
  • 当观察者在左边时, 左边灰色三角形就变成了逆时针为正面, 右边灰色三角形顺时针为背面.
  • 所以是正面还是背面, 是由顶点连接顺序和观察者的位置共同决定的. 当观察者位置发生改变时, 正背面也会发生变化.

思考

文章开头使用平面着色器绘制环时看似一切正常, 是否也存在需要正背面剔除的问题呢?

  • 答案是肯定的. 只是因为使用的是平面着色器, 正背面的颜色都是一样的. 所以肉眼无法区分出来而已.
  • 个人总结: 在绘制3D图形时, 不能光凭肉眼来判断是否有正背面剔除的问题. 观察者看不到的部分我们可以考虑将其摒除掉. 提高渲染的效率, 避免不必要的资源浪费.

剔除后的效果:

1.剔除背面(默认值): glCullFace(GL_BACK);
2.剔除正面: glCullFace(GL_FRONT);

背面是黑色

3.剔除正背面:glCullFace(GL_FRONT_AND_BACK);

正面和背面都剔除了, 这个环就消失了,什么都看不见了.

新的问题:


可以发现当旋转到侧边时, 这个环出现了缺口的现象.详情请看后续深度测试

相关文章

  • OpenGL深度测试

    在上一篇OpenGL正背面剔除中提到了正背面剔除的弊端:如果前后两个点都是正面或是背面,这时OpenGL无法区分哪...

  • OpenGL正背面剔除

    一、在渲染过程中可能产生的问题 1. 原因 在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部...

  • OpenGL 正背面剔除

    在渲染过程中可能存在的问题 在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可...

  • OpenGL: 正背面剔除

    案例分析 1.用平面着色器绘制一个环并旋转, 效果如下: 一切看似没有问题. 2.再用光源着色器绘制一个立体环并旋...

  • OpenGL正背面剔除

    1.在渲染过程中可能产生的问题 在绘制3D场景的时候,我们需要决定哪些部分是对观察者 可⻅见的,或者哪些部分是对观...

  • OpenGL 正背面剔除

    OpenGL 在绘制三维立体图形时, 如果不做处理, 就会产生一些不符合常理或者逻辑问题, 本次讲述正背面显示错...

  • OpenGL正背面剔除

    隐藏⾯面消除 Hidden surface elimination 在绘制3D场景的时候,我们需要决定哪些部分是对...

  • OpenGL 基础渲染(深度测试)

    OpenGL 基础渲染(正背面剔除) - 简书 在上文案例使用了正背面剔除后,出现了新的问题。如下图所示,那我们要...

  • OpenGL--- (四)OpenGL渲染技巧:正背面剔除

    一、什么是正背面剔除? 正背面剔除方案,是OpenGL中针对图形绘制的一种技巧,主要用于处理立体图形绘制时,只绘制...

  • OpenGL--正背面剔除

    1. 背景 在绘制3D场景时,为了尽可能的逼真,需要有远小近大的效果,而且可能会出现互相遮盖的情况。我们需要决定哪...

网友评论

      本文标题:OpenGL: 正背面剔除

      本文链接:https://www.haomeiwen.com/subject/mtouhktx.html