宏观渲染系统
图形渲染
从而为/三维模型生成图像,数学上可以用渲染方程表示两种方法:
离线渲染(光线追踪、路径追踪、辐射度算法)
实时渲染(光栅化)
微表面模型
画家算法
深度缓冲(z-buffer)无需排序,分辨率与图像(颜色缓冲)相同。
深度缓冲
宏观渲染管道
输入场景->应用阶段->几何阶段 ->光栅化阶段->输出图像
1.3D模型的创建 -> 2.配置在虚拟空间里 -> 3 顶点空间的阴影处理 -> 4.定点图元 -> 变换到摄像机空间 -> 6.Clipping和背面删除 -> 7. triangle Setup & Travesal -> 8. 像素单位的阴影处理(Shading) -> 9.Texture应用 10.Render -> 11.输出
应用阶段
场景物体图元交给GPU
输入场景->可见性检测->分组和排序->提交图元->输出图元
场景管理
场景图(Sence Graph)需要组织场景中的物体(摄像机、光源、网格 、骨骼)
空间分割技术
使用空间分割技术加速场景查询,包括:
二元空间分割BST Tree
八叉树BVH Tree(现在用的比较多)
入口(Protal)
可见性检测
平截头体剔除
遮挡剔除
细节层级剔除 LOD culling
分组和排序(按什么顺序绘制)
通常按渲染层layer分组
半透明物体不能用z-buffer排序
所以需要半透明物体运用与渲染无关的技术OIT(Order Independant)
提交图元(primitive)
drawcall
图元数据:
顶点数据(存放在顶点缓冲区,vertex buffer,vb)
索引数据(存放在索引缓冲区,index buffer,id)
几何阶段
处理变换几何图元
渲染图元 -> 图元装配 -> 顶点着色 -> 裁剪-> 屏幕映射 -> 变换后顶点
输入装配
读取vb ib,生成三角形的顶点数据
顶点着色
执行顶点着色器,输入顶点属性,计算变换,纹理坐标,顶点光照
顶点着色:空间变换
几何图元的顶点定义在模型空间,需要变换到屏幕空间
模型空间
世界空间
观察空间(透视投影or正交投影)
齐次坐标空间
屏幕空间
三个矩阵:Oject2World,View,Projection,
顶点着色:投影变换
投影变换(观察空间-齐次坐标空间)
几何着色器
朝向剔除
渲染时只渲染正面/背面
三角形裁剪
裁剪超出裁切平面的部分透视除法及
裁剪计算
透视除法及视区变换
光栅化阶段
几何形状光栅化,计算像素输出颜色
变换后的顶点 -> 扫描转换 -> 像素着色 -> 输出合并 -> 渲染目标
扫描转换
把三角形数据转换为像素的位置。需要对颜色、纹理坐标进行插值(须透视正确)会出现锯齿
像素着色
执行像素着色器(pixel/fragment shader),比如对问题采样、光照计算、阴影计算,最后输出颜色的修正
输出合并
输入像素颜色 -> alpha测试 -> 深度测试 -> 模版测试 -> alpha混合 -> 颜色缓冲
写入渲染目标
学习建议
《Real-time rendering 》
《A trip through the Graphics Pipeline 》
《腾讯游戏开发精粹》
前向管线与延迟管线 Geometry-VS-OS-FS-Render Target 前向 O(M*N) 延迟 O(M+N) more buffer