渲染管线简介:是用来创建一个几何描述3D世界的2D图像,和一个确定这个3D世界中哪一部分将被透视投影到屏幕上的虚拟摄像机。
作用:将3D场景用几何学表现出来以及用它来产生2D图像。
简化的渲染管线流程:
参考《3D游戏编程基础(DirectX9.0)》
详细图像管线流程:
伪代码描述:
// 首先,设置观察场景的方式
setupTheCamera();
// 清楚z-缓冲
clearZBuffer();
// 设置环境光源和雾化
setGlobalLightingAndFog();
// 得到可见物体列表
potentiallyVisibleObjectList = highLevelVisibilityDetermination(scene);
// 渲染它们
for (all objects in potentiallyVisibleObjectList) {
// 使用包围体方法执行低级别VSD检测
if (!object.isBoundingVolumeVisible()) continue;
// 提取或者渐进式生成几何体
triMesh = object.getGeometry();
// 裁剪和渲染面
for (each triangle in the geometry) {
// 变换顶点到裁剪空间,执行顶点级别光照
clipSpaceTriangle = transformAndLighting(triangle);
// 三角形为背向的?
if (clipSpaceTriangle.isBackFacing()) continue;
// 对视锥裁剪三角形
clippedTriangle = clipToViewVolume(clipSpaceTriangle);
if (clippedTriangle.isEmpty()) continue;
// 三角形投影至屏幕空间,并且光栅化
clippedTriangle.projectToScreenSpace();
for (each pixel in the triangle) {
// 插值颜色,z-缓冲值和纹理映射坐标
// 执行zbuffering和alpha检测
if (!zbufferTest()) continue;
if (!alphaTest()) continue;
// 像素着色
color = shadePixel();
// 写内容到帧缓冲和z-缓冲
writePixel(color, interpolatedZ);
}
}
}
参考《3D数学基础》