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

2019-06-06  本文已影响0人  xuwen_chen

正背面剔除 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在渲染的时候会把颜色值存在颜色缓冲区中 当深度测试关闭的时候 新的颜色值会简单的覆盖原来颜色缓冲区域的颜色值 当深度缓冲区再次打开的时候 新的颜色片段只有比原来的值更接近裁剪平面才会替换原来的原色片段

上一篇下一篇

猜你喜欢

热点阅读