OpenGL绘制方式
目标:
辨别所有OpenGL中可用的渲染图元
初始化和设置数据缓存,用于几何渲染
使用多实例渲染等高级技法对渲染优化
OpenGL的主要作用是将图形渲染到帧缓存中,为了实现这一要求,需要将复杂的物体分解成图元的形式(包括点线三角形),当他们的密度足够高时,就可以表达为2D和3D物体的形态。
OpenGL包含了很多渲染这种图元的函数。这些函数描述图元在内存的分布,渲染的数量和渲染采取的形式,甚至是同一组图元在一个函数中所复制的数量。这些函数几乎成了OpenGL最为重要的函数组成。如果没有他们的话我们可能除了清除屏幕之外无法完成其他任何事情了。
OpenGL可以支持多种图元,不过最终归结为三种类型中的一种,即点线三角形。线和三角形图元类型再组合为条带,循环体或者扇面。点线三角形也是大部分图形硬件设备支持的基础图元类型。
3.1.1 点
当渲染图元时,OpenGL会通过一系列光栅化规则来判断点所覆盖的像素位置。
默认点大小为1.0即屏幕上1像素。如果点的大小增加那么每个点的顶点都会占据超过1像素的值。在本质上每个点都是屏幕的方形区域,而每个像素都可以使用不同的颜色来着色。我们可以在片元着色器中通过解析纹理图来实现点的着色。
3.1.2 线、条带和循环线
OpenGL中的线是一条线段,多段线也可以进行衔接来表示一系列的线段,首尾闭合的叫做循环线(line loop)开放的多线段叫做条带线(line strip)
OpenGL对于模型三角形共享边的光栅化过程不会产生任何裂缝,也不会产生重复的绘制。
多边形可被渲染模式分为 点集、轮廓线和实体,实体分正面和背面
绘制三角形 按照逆时针方向环绕的为正面,反之为背面,为何做却分呢?
1.这是因为正反面的反射颜色等属性不同。
2.为了进行剔除,背面剔除能极大的提高性能。
深度测试是另一种消除隐藏表面的技术。原理是 给绘制的每一个像素分配一个Z值,表示它到观察者的距离,当另外一个像素需要在屏幕相同位置进行绘制时,用新Z值和旧Z值比较,Z值大的像素覆盖旧的像素。
多边形偏移
虽然深度测试能够实现真实视觉并提高性能,但是也会带一点麻烦。
比如我们需要绘制的两个物体在同一Z值上,或者绘制实心几何体又要突出它的边时,无法再利用像素覆盖来达到想要的效果了,这种现象叫做z-fighting(Z冲突)。
我们可能会想,是不是可以通过第二次绘制相同位置时在Z方向上稍微做一点偏移来解决问题,
这样做确实能达到问题,不过我们需要很小心的移动Z值,使它既能产生深度测试,又不至于移动的太多导致几何图层之间产生缝隙,我们想出了更好的方法。
调节片元的深度值,这样能使深度值产生偏移而不实际改变3D空间的物理位置。
裁切
另一种提高渲染性能的方法是只刷新屏幕上变化的部分。
混合
打开混合功能,新的颜色会和已经存在的颜色值在颜色缓冲区进行组合。
混合的另一个目的是抗锯齿
抗锯齿是平滑 点,直线和多边形的边
对于多边形或者实心物体抗锯齿性能消耗太大
此时引入新技术:多重采样。
使用额外的缓冲区保存采样结果,当像素更新时,缓冲区也更新。
这会消耗更多的内存和处理器开销,有可能对性能造成影响。
还需要注意的是:
启用多重采样会关闭点线和多边形的平滑特性;
所以在绘制点线时关闭多重采样,绘制实心几何图形时再打开它。