解决OpenGL渲染过程中产生的问题--隐藏面消除解决方案

2019-05-17  本文已影响0人  紫水依
一. 渲染过程中产生的问题
二. 隐藏面消除的解决方案
  1. 油画算法
    场景中物体距离观察者有远有近,先绘制远的再绘制近的,重合的部分距离近的会覆盖远的,就解决了不可见部分需要隐藏的问题。

  2. 正背面剔除(Face Culling)

// 开启正面剔除,默认是背面剔除
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);
  1. Z-buffer方法(深度缓冲区DepthBuffer)
    通过计算图形像素点的深度值与缓冲区中的深度值的比较来确定是否绘制的方法来解决隐藏面消除的问题。

在决定是否绘制一个物体表面时,首先要将表面对应的像素的深度值与当前深度缓冲区存储的值进行比较,如果大于深度缓冲区中的值则丢弃,否则利用这个像素对应的深度值和颜色值分别更新深度缓冲区和颜色缓冲区,这个过程称为深度测试。

深度值一般由16位、24位或者32位值表示,通常是24位。位数越⾼的话,深度的精确度越好。深度值的范围在[0,1]之间,值越⼩表示越靠近观察者,值越⼤表示远离观察者。

深度缓冲区存储场景中所有对象的z值,将观察者看到的内容的z值与深度缓冲区中存储的z值进行比较,来确定需要绘制的部分。
视图空间中的z值是投影到平面上的距离,这个值不在[0,1]范围内,需要通过下面的方程来转换,从而进行与深度缓冲区中的值比较。
下面的 (线性) 方程把 z 值转换为 0.0 和 1.0 之间的值:


转换视图空间z值的方程式

(far和near是提供到投影矩阵设置可见视图的远近值)

上一篇 下一篇

猜你喜欢

热点阅读