美文网首页
OpenGL在渲染中可能产生的问题及预防方案

OpenGL在渲染中可能产生的问题及预防方案

作者: xuwen_chen | 来源:发表于2019-06-06 14:28 被阅读0次

    正背面剔除 Face Culling

    我们在绘制一个多边形的时候 从任意一个方向去观察它 我们最多只能看到3个面 在绘制的过程中 我们没有必要去绘制我们看不到的一面 如果我们用某种方式去丢弃这部分的数据 这样可以提高openGL的渲染性能 这时我们引入正背面剔除

    openGL可以检查所有正面朝向观察者的面 从而丢弃背面朝向的面 节约片元着色器的性能

    深度测试

    了解深度
    深度就是像素点到在3D世界中距离摄像机的距离 Z值

    深度缓冲区
    深度缓冲区 就是内存中一个专门的区域用来存储每个像素点的深度值 深度值越大 离摄像机的距离越远

    深度缓冲区的作用
    如果我们不使用深度缓冲区 我们先绘制比较近的物体 再绘制比较远的物体 这时候比较远的物体因为后绘制 会把距离近的物体给遮挡 如果有了深度缓冲区 绘制物体的顺序就不重要 openGL 会把像素的深度值写入到深度缓冲区

    深度测试
    深度缓冲区(DepthBuffer) 和颜色缓冲区(ColorBuffer)是对应的 颜色缓冲区存储像素的颜色信息 深度缓冲区存储像素的深度信息 在决定是否绘制一个表面的时候 会先表面的像素的深度值与深度缓冲区的值进行比较 如果大于深度缓冲区的值 就会丢弃这一部分 否则将利用这个像素值对应的深度值和颜色值来更新深度缓冲区和颜色缓冲区的值 这个过程就叫做深度测试

    ZFighting闪烁

    开启了深度测试后 就不会再去绘制被遮挡的部分 但是如果两个面的距离非常近 OpenGL可能不能正确的判断他们的深度值 将导致深度测试的结果不可预测 显示出来的是两个画面交错闪烁

    第一步 启用 polygon Offset方式解决
    让深度值直接产生间隔 可以理解为 执行深度测试之前 将立方体的深度值做一些细微的增加
    glEnable(GL_POLYGON_OFFSET_FILL)

    第二步 指定偏移量
    通过glPolygonOffset 来指定.glPolygonOffset 需要2个参数: factor , units

    第三步: 关闭Polygon Offset
    glDisable(GL_POLYGON_OFFSET_FILL)

    裁剪

    OpenGL中提高渲染的一种方式 只刷新屏幕上发生变化的一部分 OpenGL允许将要进行渲染的窗口只指定一个裁剪框
    基本原理 用于渲染指定的区域 在屏幕上指定一个矩形区域 启用裁剪测试后 不在这个区域的片元将会被丢弃 只有在这个区域的片元才有可能进入帧缓冲区 实际效果就是在屏幕中开启了一个窗口 在它中间对指定内容进行绘制

    混合

    OpenGL在渲染的时候会把颜色值存在颜色缓冲区中 当深度测试关闭的时候 新的颜色值会简单的覆盖原来颜色缓冲区域的颜色值 当深度缓冲区再次打开的时候 新的颜色片段只有比原来的值更接近裁剪平面才会替换原来的原色片段

    相关文章

      网友评论

          本文标题:OpenGL在渲染中可能产生的问题及预防方案

          本文链接:https://www.haomeiwen.com/subject/xxxuxctx.html