深度测试

本文介绍了一种通过设置偏移值来实现物体边缘加亮的技术,并详细解释了深度缓存在消除隐藏表面中的作用。文章提供了具体实现代码示例,展示了如何使用OpenGL函数如glPolygonOffset和glPolygonMode来调整多边形的渲染方式。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值