OpenGL正背面剔除

2020-07-09  本文已影响0人  奉灬孝

一、在渲染过程中可能产生的问题

1. 原因

在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可见的.对于不可见的部分,应该及早丢弃.
例如在一个不透明的墙壁后,就不应该渲染.这种情况叫做隐藏面消除(Hidden surface elimination).

2.示例
渲染问题展示

二、解决方案

1.油画算法
2.正背面剔除
  1. 原理
    OpenGL 可以做到检查所有正⾯面朝向观察者的⾯面,并渲染它们。从⽽而丢弃背⾯面朝向的⾯面。这样可以节约⽚片元着⾊色器器的性能,渲染的性能即可提高超过50%
  2. 正背面区分
    正面: 按照逆时针顶点连接顺序的三角形面
    背面: 按照顺时针顶点连接顺序的三角形面
    分析正方体的正背面.png
  3. 正背面区分问题:正⾯和背⾯是有三角形的顶点定义顺序和观察者方向共同决定的。若观察者的观察⽅向发生改变,正⾯和背面也会发生相应的改变。
  1. 弊端:如果前后两个点都是正面或是背面,这时OpenGL无法区分哪个面在前,哪个面在后,就可能出现下图所示的问题。
    正背面区分问题.png
  2. 有关正背面剔除函数
void glEnable(GL_CULL_FACE);
void glDisable(GL_CULL_FACE);
void glCullFace(GLenum mode);
mode参数为: GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默GL_BACK
void glFrontFace(GLenum mode);
mode参数为: GL_CW,GL_CCW,默认值:GL_CCW 
glCullFace(GL_BACK); 
glFrontFace(GL_CW);
glCullFace(GL_FRONT);
glFrontFace(GL_CCW);
上一篇下一篇

猜你喜欢

热点阅读