opengl如何控制不想出现的几何图形 表面剔除or深度测试or多边形模式and多边形偏移

1.最拉的一个方法,油画法,对这些三角形进行排序,并且首先渲染那些较远的三角形,再在它们上方渲染那些较近的三角形。
十分低效,因为(1)必须对任何发生几何图形重叠地方的每个像素进行两次写操作,而在存储其中进行写操作会使速度变慢。(2)对独
立的三角形进行排序的开销会过高。
填充受限:对于图形硬件来说,这样做会导致在同一个片段区域重复进行绘制,而每一次绘制都会产生性能开销。如果开销过大则导致光栅化过程变慢,我们将这种方式称为“填充受限”。

2.比较有用的三个方法:
(1)表面剔除,在了解了“环绕”之后,我们可以设置我们渲染的每个图形的正面和背面,在渲染的图元装配阶段就整体抛弃了一些三角形,并且没有执行任何不恰当的光栅化操作。
glEnable(GL_CULL_FACE);/glDisable(GL_CULL_FACE);
如何控制剔除哪个面:
glCullFace(GL_BACK/GL_FRONT);
glEnable(GL_CULL_FACE);
如何指定那个面是正面,默认情况下逆时针是正面,也可以自行设置,cw和ccw:
glFrontFace(GL_CW/GL_CCW);

在计算机图形学中,渲染透明对象的确需要对实体几何体的正面和背面进行不同的处理。透明对象在渲染时需要考虑到它们相互之间的相互作用和重叠关系,因此需要进行混合和排序。
在进行透明对象的渲染时,通常需要进行两次渲染,第一次渲染时开启透明,并剔除正面,只渲染背面,第二次渲染时则关闭透明,只渲染正面。
剔除实体几何体的正面有时也可以用于显示某些图形的内部,例如当渲染封闭的物体时,可以剔除正面以便于显示物体的内部,或者当需要渲染几何体的反面时,也可以剔除正面以避免重复渲染。

(2)深度测试(Z-Buffer)概念很简单: 在绘制一个像素时,将一个值(称为z值)分配给它,这个值表示它到观察者的距离。当另外一个像素需要在屏幕上的同样位置进行绘制时,新像素的z值将与已经存储的像素的z值进行比较,如果新像素的z值大,说明他离观察者更近,就在原来像素的上面,原来的像素就会被新像素覆盖。在OpenGL内部是使用深度缓冲实现的,它存储了屏幕上每个点的z值。
在我们使用glut设置OpenGL窗口的时候:glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH),就说明我们使用了双缓冲帧模式,颜色缓冲器,深度缓冲器。
启用深度测试:
glEnable(GL_DEPTH_TEST);
如果没有深度缓冲区,那么启用深度测试的命令将被忽略。
这个方法算是油画法的颠倒使用,首先绘制那些离观察者较近的对象,然后再绘制那些较远的对象。深度测试将消除那些应该被已存在像素覆盖的像素(已经被消除的就不用进行光栅化了),这将节省可观的存储器带宽。
这个方法能很好的解决自身重叠的对象的渲染问题。

(3)多边形模式:多边形(含三角形)不一定是实心的,在默认情况下,多边形是作为实心图形绘制的,但我们可以通过将多边形指定为显示轮廓或只有点(只显示顶点)来改变这种行为。函数glPolygonMode允许将多边形渲染成实体、轮廓或只有点。在多边形的两面都应用这个渲染模式,也可以只在正面或背面应用。

glPolygonMode是一个OpenGL函数,用于设置多边形的绘制模式。它可以控制OpenGL如何绘制多边形的三角形图元。
void glPolygonMode(GLenum face, GLenum mode);
该函数有两个参数:face和mode。face参数用于指定要设置哪个面的绘制模式,可以是GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;mode参数用于指定绘制模式,可以是GL_POINT、GL_LINE或GL_FILL。

用多边形偏移给物体画线框加强立体感

深度测试在实现真实视觉和提高性能方面的确非常重要,但在某些情况下会产生一些问题,如z-fighting(z冲突),这是因为两个物体同一位置时深度缓冲区无法区分它们哪一个在前面哪一个在后面。
**解决方法:**深度偏移:深度偏移通常在需要绘制两个或多个物体在同一位置时使用,如绘制地面和天空盒。在这种情况下,两个物体的深度值非常接近,因此需要添加一个小的偏移量来避免深度冲突。需要注意的是,深度偏移只适用于填充模式,对线框模式和点模式没有作用。此外,使用深度偏移也可能会影响深度测试的准确性,因此需要谨慎使用。

glPolygonOffset函数使我们可以调节片段的深度值,这样就能使深度值产生偏移而并不实际改变3D空间中的物理位置。
glEnable(GL_POLYGON_OFFSET_FILL);
void glPolygonOffset(GLfloat factor, GLfloat units);

实际偏移量offset,offset = factor * DZ + units * r
DZ是深度值差,r是多边形的最小可分辨深度单位,通常为0.0。在OpenGL中,DZ的计算方法是将深度值乘以深度缓冲区精度,然后取整数部分。例如,如果深度缓冲区精度为24位,则DZ可以计算为:
DZ = 1 / (2^24 - 1)
factor参数指定了偏移量的比例因子,决定了偏移量的方向当factor为正数时偏移量将向外(远离观察者)移动当factor为负数时偏移量将向内(靠近观察者)移动

//绘制实心物体
        //绘制实心物体
        glColor3f(0.0f, 1.0f, 0.0f);
        glEnableClientState(GL_VERTEX_ARRAY);
        glBindBuffer(GL_ARRAY_BUFFER, pyramidVboId);
        glVertexPointer(3, GL_FLOAT, 0, 0);
        glDrawArrays(GL_TRIANGLES, 0, 12);//

        //绘制边框
        glPolygonOffset(-1.0f, -1.0f);//用多边形偏移,这里让画出来的边框摄像机更近以便进行完深度测试能完全覆盖多边形的边,用了这个之后线框的深度值就都要小于画的面的深度值
        glEnable(GL_POLYGON_OFFSET_LINE);//开启线框模式的多边形深度偏移的功能
        // Draw lines antialiased
        glEnable(GL_LINE_SMOOTH);//开启(边框)线平滑,因为这个smooth使用混合实现的所以还要开启混合
        glEnable(GL_BLEND);//开启混合
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//用线框的形式去绘制一个边框,正反面都用线的形式去画
        glLineWidth(2.5f);
        glColor3f(0.0f, 0.0f, 0.0f);
        glEnableClientState(GL_VERTEX_ARRAY);
        glBindBuffer(GL_ARRAY_BUFFER, pyramidVboId);
        glVertexPointer(3, GL_FLOAT, 0, 0);
        glDrawArrays(GL_TRIANGLES, 0, 12);//空心三角形线框集画金字塔

        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//画完线框改回画填充图的模式
        glDisable(GL_POLYGON_OFFSET_LINE);//关闭深度偏移的功能
        glLineWidth(1.0f);
        glDisable(GL_BLEND);
        glDisable(GL_LINE_SMOOTH);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值