RTR4:图形渲染管线 v0.01
第二章
- 功能:给定相机,对象,光源等生成二维图像。是实时渲染的底层工具
- 本章重点是功能性介绍,不涉及实现
2. 1 架构
- 每个阶段都是并行的,阶段和阶段也是并行的
- 应用→几何处理→光栅化→像素处理
- FPS与 s/frame 更新频率,赫兹用于显示器的表示
- 概述:
- 应用阶段:碰撞检测,全局加速,动画,物理模拟等(依赖于具体实现
- 几何处理:变换,投影,绘制(什么,在哪,如何)
- 光栅化:生成三角形,找像素
- 像素处理:颜色,测试,混合
2.2 应用阶段
- 将图元:点,线,三角等送给几何阶段处理
- 进一步:ch18.5 优化该阶段无法并行的问题
- 其他功能:碰撞检测,处理输入,加速算法(如ch19 剔除算法
2.3 几何处理
- 顶点着色→投影→剪裁→屏幕映射
2.3.1 顶点着色器
-
任务:计算位置以及其他位置数据(如法线,纹理坐标
-
作用:设置动画 ch4.4 ch4.5
-
坐标空间
- 模型空间(可通过实例化生成多个模型而不用复制几个几何图形
- 模型变换:顶点和法线
- 世界空间
- 视图变换
- 相机空间:轴的约定方向(x右,y上,z看情况
-
任务:顶点着色(可以是任何和着色结果有关的信息 ch3 ch5
-
投影(正交或透视)
- 矩阵构建 ch4 与表示:通常以矩阵表示以和其他几何变换连接(ch4.7
- 正交投影的view volume是矩形:转换是平移加缩放
- 透视投影是视锥体
- 结果:clip coordinates,是齐次坐标,还未被w除
- 投影结果:3D→2D,z坐标存在z缓冲区 ch2.5
-
剪裁:投影后裁剪 -1到1
2.3.2可选的顶点处理
- 曲面细分→几何着色→流输出 ch3
- 曲面细分
- 作用:根据情况生成适量的三角形
- 组成:外壳着色器,镶嵌器,域着色器
- 几何着色器
- 作用:粒子生成,烟花爆炸等(由1个点变成多个点组成的正方形
- 接受图元产生新顶点
- 流输出
- 作用:粒子模拟,如烟花
- 将处理后的顶点存起来进一步处理
2.3.3 裁剪
- 只需要立方体内的图元(对应视锥体内的图元
- 超出部分被丢弃,按情况生成新顶点
2.3.4 屏幕映射
- 屏幕映射:x,y通过平移+缩放转换为屏幕坐标
- z坐标
- OPENGL:-1 到 1
- DIRECTX:0 到 1
- 映射到z_1 到z_2 默认0到1,但可设置
如何将整数和浮点数的点映射到像素(和纹理坐标)
-
设一组水平数组,左边为0,像素中心为0.5
- 则像素范围[0,9] 覆盖了[0.0,10.0)的范围
-
转换:
- d为像素的索引(离散的
- c为像素(连续的浮点值
-
像素位置:
- OPENGL:从左到右,从下到上,零点在左下角
- DIRECTX:从左到右,从上到下,零点在左上角
2.4 光栅化(扫描转换
- 三角形设置(原始组装)→三角形遍历
- 目的:找到图元内部的所有像素,将二维顶点转换为像素
- 所以虽然说是三角形,但图元可以是点和线
- 如何判断是否覆盖像素:
- 取决于管线设置:如设置点采样
- 最简单的:中心点采样
- 多个样本超级采样,多重抗锯齿:ch5.4.2
- 保守光栅化:像素至少一部分重叠 ch23.1.2
- 取决于管线设置:如设置点采样
2.4.1 三角形设置
- 计算三角形相关数据
- 作用:三角形遍历,几何阶段的着色插值
2.4.2 三角形遍历
- 判断重叠,生成片段,采样方法 ch5.4
- 生成插值数据:如片段的深度等,如透视插值 ch23.1.1
2.5 像素处理
- 像素着色→像素合并
- 对图元内部的像素和样本进行处理
2.5.1 像素着色
- 作用:根据插值后的着色数据,对每个像素片段进行计算,最终生成一种或多种颜色到下一阶段
- 应用:纹理 ch06
2.5.2 合并
- 颜色缓冲区:存储像素信息的数组
- 作用
- 将计算生成的颜色和缓冲区的合并起来
- 可见性设置
- 深度缓冲区与z-buffer算法
- 大小形状与颜色缓冲区相同
- 算法:离相机近(近的定义可设置),即比缓冲区的值小则写入
- 算法复杂度 On
- 弱点:透明物体无法表示
- 解决方法:先绘制不透明的图元,再从后到前绘制透明图元
- 或采用与顺序无关的算法 ch5.5
- alpha通道:与颜色缓冲区相关联,提供不透明值
- 作用:老API中提供alpha测试来丢弃片段
- 应用:现在可以在像素着色器中丢弃
- 保证完全透明的片段不会影响z缓冲区
- 模板缓冲区
- 大小通常为每个像素8位
- 应用:利用操作符实现类似于模板的效果
一些api提供raster order views, also called pixel shader ordering, 像素着色器排序,支持可编程混合功能
帧缓冲区与双缓冲技术
- 帧缓冲区由上述缓冲区组成
- 双缓冲技术:当图元达到并通过光栅化阶段时,从相机的角度可见的图元将显示在屏幕上。屏幕显示颜色缓冲区的内容。为了避免让人类查看者在图元被光栅化并发送到屏幕时看到它们,使用了双缓冲
进一步
参考:ch5.4.2 ch23.6 ch23.7
总结
- 这里介绍的是实时渲染管线,不是唯一的渲染管线
- 离线渲染管线有别的发展方向,但目前是光追和路径追踪 ch11.2.2
参考
- 顶点着色器:1049
- 三角形遍历:1162
- 透视插值:649
- 深度缓冲区与z-buffer算法:238
- 离线的伪多边形管线:289 1734
进一步:
- 软件渲染器的实现 165
- 图形管道与相关算法 885
- realtimerendering 对应参考
习题
- 什么是图形渲染管线,分为那些阶段?
- 描述图形渲染管线每个阶段的具体任务?