渲染(Rendering)是图形学的三大问题之一,除此之外还包括几何(Geometry)和动画(Animation)。
给定一个虚拟三维场景的描述(包括模型、位置关系、光照等),渲染过程将3D的场景信息输入转化为2D的图片。渲染是通过三维模型得到二维图像的过程,使用3D Programming。
渲染流程
-
确定场景中物体位置
-
加入摄像机视角(玩家眼睛)
-
把三维世界投影为屏幕图像
分为两种:
传统表面渲染流程(基于图形学管线) 适用:Mesh / NURBS 等显式几何
- 场景准备(CPU):加载几何、材质、纹理、光源、相机
- 顶点处理(Vertex Shader):模型空间 → 裁剪/屏幕空间(MVP)
- 图元装配:顶点组装为三角形/线段
- 裁剪(Clipping):剔除视锥外图元
- 光栅化(Rasterization):图元 → 像素片段(Fragment)
- 片段着色(Fragment Shader):纹理采样、光照计算
- 测试与混合:深度/模板测试,颜色混合
- 写入帧缓冲:输出最终图像
Volume Rendering流程(Volumetric Rendering) 适用:体素网格、密度场、隐式场(如 NeRF)
- 场景准备:加载体数据(显式网格或隐式网络)
- 射线生成:为每个像素发射相机射线
- 射线采样:沿射线按步长采样点 ({x_i}_{i=1}^N)
- 属性查询:每个采样点获取密度 (\sigma_i) 与颜色 (c_i)
- 体渲染积分: 其中 (T_i) 为到第 (i) 点的透射率、(\delta_i) 为相邻采样间距
- 像素合成:累积采样点贡献得像素颜色
- 写入帧缓冲:输出最终图像
区别:
流程环节 | 表面渲染(茶壶例子) | 体渲染(云雾例子) |
---|---|---|
数据结构 | 顶点+面片 | 密度场 / 隐式函数 |
光线处理 | 光栅化像素 | 光线积分 |
几何表示 | 明确定义表面 | 连续体积(无明确表面) |
应用 | CAD、游戏、硬表面 | 烟雾、云、医学扫描、NeRF |