深度测试

来源:互联网 发布:母婴店软件 编辑:程序博客网 时间:2024/06/06 17:06

应用场景:加亮物体的边缘。
深度缓存会记录场景中物体与视点的距离。深度缓存主要用途是隐藏表面的消除。

void glPolygonOffset(GLfloat factor, GLfloat units);//设定偏移值void glPolygonMode();//设定多边形的光栅化方式。/*GL_POLYGON_FILL /LINE /POINT*/ 

offset = m * factor +r *units;
m 为多边形的最大斜率,r 为两个不同的深度之间可识别的最小差值。
m 计算方法为

m=(zx)2+(zy)2

或是
m=max(zx,zy)

未设置偏移的效果:
这里写图片描述
设置偏移效果:
这里写图片描述

void Basic::draw(void){    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);    CHECK_GL_ERROR();      GLboolean bDepth = glIsEnabled(GL_DEPTH_TEST);     glEnable(GL_DEPTH_TEST);     CHECK_GL_ERROR();     glClear(GL_COLOR_BUFFER_BIT);     CHECK_GL_ERROR();     const float position[] = {         -1.0f, -1.0f,         1.0f, -1.0f,         -1.0f, 1.0f,         1.0f, 1.0f,     };     float color0[] = {         1.0f,0.0f,0.0f,1.0f,         1.0f,0.0f,0.0f,1.0f,          1.0f,0.0f,0.0f,1.0f,          1.0f,0.0f,0.0f,1.0f};     glVertexAttribPointer(posIndex, 2, GL_FLOAT, false, 2 * sizeof(float), position);     glEnableVertexAttribArray(posIndex);     glVertexAttribPointer(colorIndex, 4, GL_FLOAT, false, 4* sizeof(float), color0);     glEnableVertexAttribArray(colorIndex);     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);     float color1[] = {         1.0f,1.0f,0.0f,1.0f,         1.0f,1.0f,0.0f,1.0f,         1.0f,1.0f,0.0f,1.0f,         1.0f,1.0f,0.0f,1.0f };     glVertexAttribPointer(colorIndex, 4, GL_FLOAT, false, 4 * sizeof(float), color1);     glEnable(GL_POLYGON_OFFSET_LINE);     glPolygonMode(GL_FRONT, GL_LINE);     glPolygonOffset(-1.0, -1.0);     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);     glDisable(GL_POLYGON_OFFSET_LINE);     glDisableVertexAttribArray(posIndex);     glDisableVertexAttribArray(colorIndex);     glDisable(GL_DEPTH_TEST);     glPolygonMode(GL_FRONT, GL_FILL);}

源码: https://t.xiaomiquan.com/QBeAa2n