游戏开发工程师--实时图形渲染管道

349 阅读3分钟

宏观渲染系统

图形渲染

从而为/三维模型生成图像,数学上可以用渲染方程表示两种方法: 离线渲染(光线追踪、路径追踪、辐射度算法)
实时渲染(光栅化)
微表面模型

画家算法 深度缓冲(z-buffer)无需排序,分辨率与图像(颜色缓冲)相同。 深度缓冲

宏观渲染系统

宏观渲染管道

输入场景->应用阶段->几何阶段 ->光栅化阶段->输出图像

GPU渲染管道总览

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混合 -> 颜色缓冲

写入渲染目标

Triplanar Shader

学习建议

《Real-time rendering 》

《A trip through the Graphics Pipeline 》

《腾讯游戏开发精粹》

前向管线与延迟管线 Geometry-VS-OS-FS-Render Target 前向 O(M*N) 延迟 O(M+N) more buffer

Real-time rendering
jcgt
gdcvault
cedil
miloyip