计算机速成课 第二十七集 3D 图形
1. 引言
3D 世界中,点的坐标不再是两个点,而是三个点,X, Y, Z
2. 3D 投影:
- 概念:通过图形算法,把3D坐标「拍平」显示到2D屏幕上
- 分类
- 正交投影:立方体的各个边,在投影中互相平行
- 透视投射:在真实 3D 世界中,平行线段会在远处收敛于一点,就像远处的马路汇聚到一点
- 网格:一堆多边形的集合。网格越密,表面越光滑,细节越多
- 三角形:更常用因为能定义唯一的平面
3. 线框渲染 Wireframe Rendering
所有的点从 3D 转成 2D 后,就可以用画 2D 线段的函数,来连接这些点。
4. 扫描线渲染 Scanline Rendering
- 是一种算法名称
- 作用:填充图形
- 1967 年诞生于犹他州大学
- 填充的速度叫 fillrate (填充速率)
5. 抗锯齿:
- 定义:减轻锯齿的方法
- 原理:如果像素在多边形内部,就直接涂颜色;如果多边形划过像素,颜色就浅一些,这种边缘羽化的效果,看着更舒服些
- 使用场景:字体、图表等
6. 遮挡 Occlusion
- 在 3D 场景中,多边形到处都是,但是只有一部分能看见,因为其他的被挡住了。
- 原理:使用画家算法
- 是什么:使用排序算法,从远到近排列,然后从远到近渲染
7. 深度缓冲 Z-Buffering
- 特点:可以记录场景中每一个像素和摄像机的距离
8. Z Fighting 错误
两个多边形或者多个多边形距离都一样的时候,不确定哪一个会画上面。多边形会在内存中移来移去,访问顺序会不断变化;另外,计算浮点数有舍入误差。所以哪一个画在上面,往往是不可预测的,导致出现 Z-fighting 效果
9. 背面剔除 Back-Face Culling
- 3D 游戏中的一个优化
- 解释:游戏角色的头部或地面,只能看到朝外的一面,为了节省处理时间,会忽略多边形背面,减了一半多边形面数
10. 明暗处理
- 解释:在 3D 场景中,物体表面应该有明暗变化
- 表面法线:多边形面对的方向
- 平面着色:
- 最基本的照明算法
- 多边形的边界非常明显,看起来不够光滑
- 高洛德着色
- 特点;不只用一种颜色给整个多边形上色,而是以巧妙的方式改变颜色,得到更好的效果
11. 纹理 Textures
- 在图形学中指外观,而不是手感
- 算法:纹理映射
- 在多边形中,查询纹理,从相应区域取平均颜色,并填充多边形,重复这个过程,就可以获得纹理
小结:
再大的场景,过程都是一样的,一遍又一遍,处理所有多边形。扫描线填充,抗锯齿,光照,纹理化。
12. 如何加速渲染
- 为这种特定运算,做专门的硬件来加快速度
- 把 3D 场景分解成多个小部分,然后并行渲染,而不是按顺序渲染
13. 图形处理单元 GPU
- 计算机工程师为图形做的专门处理器
- 位置:在显卡上,周围有专用的 RAM
- 所有网格和纹理都在GPU中,让GPU的多个核心可以高速访问