2024-07-02 07:05:01
在绘制3D场景时,我们需要决定哪些部分是对观察者可⻅的,或者哪些部分是不可见的。对于不可⻅的部分,应该及早丢弃,这种做法叫做 隐藏⾯消除 。
先绘制红色部分,再绘制⻩色部分,最后再绘制灰⾊部分,即可解决隐藏面消除的问题。即将场景按照物理距离和观察者的距离远近排序,由远及近的绘制即可。
弊端: 如果三个三⻆形是相互重叠的,油画算法将⽆法处理。
从任何⼀个⽅向去观察一个立方体,最多可以看到3个⾯。如果我们能以某种⽅式去丢弃这部分数据。OpenGL在渲染的性能即可提高超过50%。
任何平⾯都有2个⾯:正⾯和背面,⼀个时刻我们只能看到一面。 通过分析顶点数据的顺序 ,OpenGL可以做到检查所有正面朝向观察者的面,并渲染它们;从⽽丢弃背面朝向的面。
⚠️注意: 正⾯和背⾯是有三角形的顶点定义顺序和观察者方向共同决定的。若观察者的观察⽅向发生改变,正⾯和背面也会发生相应的改变。
弊端: 如果前后两个点都是正面或是背面,这时OpenGL无法区分哪个面在前,哪个面在后,就可能出现下图所示的问题。
深度,就是像素点在3D世界中距离摄像机的距离,即Z值。
深度缓存区,就是⼀块内存区域,专门存储每个像素点的深度值。深度值(Z值)越⼤,则离摄像机就越远。
为什么需要深度缓冲区?
深度缓冲区和颜⾊缓存区是对应的。颜⾊缓存区存储 像素的颜⾊信息 ,而深度缓冲区存储 像素的深度信息 。
在决定是否绘制⼀个物体表⾯时,首先要将表面对应的像素的深度值与当前深度缓冲区中的值进⾏⽐较。如果大于深度缓冲区中的值,则丢弃这部分;否则利⽤这个像素对应的深度值和颜⾊值,分别更新深度缓冲区和颜色缓存区。这个过程称为 深度测试 。
深度值,⼀般由16位、24位或者32位值表示,通常是24位。
使⽤正⾯/背面剔除法和深度测试法解决了OpenGL的渲染效率问题。
由于精度的限制,对于相差非常小的深度值(比如在同一个深度进行2次渲染),就可能出现不能正确区分两个深度值的问题,导致测试的结果随机出现。所以,显示时2个画⾯交错出现,就会出现闪烁问题。
增大重叠或深度值接近的2个图形的深度值差距,使得OpenGL可以区分两个深度值。
步骤三: 关闭Polygon Offset
在OpenGL中提⾼渲染效率的⼀种⽅式。 只刷新屏幕上发⽣变化的部分。
OpenGL渲染时会把颜色值存在颜⾊缓存区中,每个⽚段的深度值也是放在深度缓冲区。
当混合功能被开启时,源颜色和⽬标颜色的组合方式是 混合方程式 控制的。在默认情况下,混合方程式如下所示:
混合函数经常用于实现在其他一些不透明的物体前面绘制一个透明物体的效果。
实际上不止一种颜色混合方程式,OpenGL有5个不同的方程式进行选择。
表中R、G、B、A 分别代表 红、绿、蓝、Alpha
表中下标S、D,分别代表源、⽬标
表中C 代表常量颜⾊(默认⿊色)
下⾯通过一个常见的混合函数组合来说明问题:
如果颜色缓存区已经有一种颜⾊红色(1, 0, 0, 0)
在这上面混合一种alpha为0.6的蓝色(0, 0, 1, 0.6)
最终颜色是以原先的红色(⽬标颜色)与后来的蓝色(源颜色)进⾏组合。源颜色的alpha值越高,添加的蓝色颜色成分越高,⽬标颜⾊所保留的成分就会越少。