OpenGL图形图像渲染中的深度缓冲区

2019-05-20  本文已影响0人  盾子

深度值计算

深度值一般由16位,24位或者32位值表示,通常是24位。位数越高的话,深度的精确度越高。深度值的范围在[0,1]之间,值越小表示越靠近观察者,值越大表示远离观察者。深度缓冲主要是通过计算深度值来比较⼤小,在深度缓冲区中包含深度值介于0.0和1.0之间,从观察者看到其内容与场景中的所有对象的z值进行了比较。这些视图空间中的z值可以在投影平头截体的近平面和远平⾯之间的任何值。我们因此需要一些⽅法来转换这些视图空间z值到[0,1]的范围内,下⾯的(线性)方程把z值转换为0.0和1.0之间的值:

开启深度测试

开启深度测试:

glEnable(GL_DEPTH_TEST);

在绘制场景前,清除颜⾊缓存区和深度缓冲区,清除深度缓冲区默认值为1.0,表示最大的深度值。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

指定深度测试判断模式:

void glDepthFunc(GLEnum mode);
深度测试模式说明

打开/阻断深度缓存区写⼊:

void glDepthMask(GLBool value);
value : GL_TURE 开启深度缓冲区写⼊入; GL_FALSE 关闭深度缓冲区写⼊入

完整使用代码如下:

// 召唤场景
void RenderScene(void)
{
    //清除颜色和深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //开启深度测试
    glEnable(GL_DEPTH_TEST);
    //把摄像机矩阵压入模型矩阵中
    modelViewMatix.PushMatrix(viewFrame);
    
    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    
    //使用默认光源着色器
    //通过光源、阴影效果跟提现立体效果
    //参数1:GLT_SHADER_DEFAULT_LIGHT 默认光源着色器
    //参数2:模型视图矩阵
    //参数3:投影矩阵
    //参数4:基本颜色值
    shaderManager.UseStockShader(GLT_SHADER_DEFAULT_LIGHT, transformPipeline.GetModelViewMatrix(), transformPipeline.GetProjectionMatrix(), vRed);
    
    //绘制
    torusBatch.Draw();

    //出栈
    modelViewMatix.PopMatrix();
    
    glutSwapBuffers();
}

开启深度测试可能带来的问题

//启⽤用Polygon Offset ⽅方式 glEnable(GL_POLYGON_OFFSET_FILL)
参数列列表: 
GL_POLYGON_OFFSET_POINT  对应光栅化模式: GL_POINT
GL_POLYGON_OFFSET_LINE   对应光栅化模式: GL_LINE
GL_POLYGON_OFFSET_FILL 对应光栅化模式: GL_FILL
  1. 第⼆步: 指定偏移量量
void glPolygonOffset(Glfloat factor,Glfloat units);

glPolygonOffset 需要2个参数: factor , units.
每个Fragment 的深度值都会增加如下所示的偏移量量:
Offset = ( m * factor ) + ( r * units);
m : 多边形的深度的斜率的最大值,理解一个多边形越是与近裁剪面平行,m 就越接近于0.
r : 能产生于窗口坐标系的深度值中可分辨的差异最⼩小值.r 是由具体是由具体OpenGL 平台指定的⼀个常量.
一个大于0的Offset 会把模型推到离你(摄像机)更远的位置,相应的一个小于0的Offset 会把模型拉近
一般⽽言,只需要将-1.0 和 -1 这样简单赋值给glPolygonOffset 基本可以满⾜需求.
3. 第三步: 关闭Polygon Offset

glDisable(GL_POLYGON_OFFSET_FILL)
上一篇 下一篇

猜你喜欢

热点阅读