3D渲染简介

3D实时渲染可以说是游戏客户端的核心技术。

三角形网格

通常来说,游戏会使用三角形网格来为表面建模(电影可能会采用矩形或者多边形)。几乎所有的GPU都是为三角形光栅化设计的。

一个三角形由三个顶点表示。在一个模型中,描述三角形的时候,因为有很多重复的顶点,通常会索引化顶点数据。

一个模型三角形数量越多就越精细,但是渲染需要更多性能。战神4一个模型有70-100k的三角形,其中面部有30k。

在游戏中,通常会根据模型离得远近来加载精度不同的模型。每个模型称作一个LOD(level-of-detail)。还有甚至用算法来增加和删除顶点。

渲染流程

  1. CPU阶段
    • 可见性判断
    • 上传可见物体的数据到显存(顶点,纹理数据)
    • 设置渲染状态(包括材质、纹理、着色器)
    • 调用Draw Call通知GPU开始渲染
  2. GPU阶段(programmable graphics pipeline)

GPU的渲染流水线实现。颜色表示了不同阶段的可配置性或可编程性:

  • 绿色表示该流水线阶段是完全可编程控制的。
  • 黄色表示该流水线阶段可以配置但不是可编程的。
  • 蓝色表示该流水线阶段是由GPU固定实现的,开发者没有任何控制权。
  • 实线表示该shader必须由开发者编程实现。
  • 虚线表示该Shader是可选的 。

在大场景的地图,通常会用四叉树、八叉树、BSP树等来对物体做可见性判断。

逐片元操作会经过模板测试,深度测试最后混合颜色到颜色缓冲区。

空间变换

要将场景中模型的顶点渲染到屏幕指定的位置,需要经历一些列的坐标空间变换。通常在顶点着色器中乘以MVP矩阵,将顶点从模型空间转换到裁剪空间。屏幕的空间转换由底层进行。MVP矩阵一般有API可以直接获取。

投影矩阵分为透视矩阵和正交矩阵。分别用在3d和2d效果。

着色器

着色器(Shader)为gpu的高级语言,有oepngl的GLSL、directX的HLSL等。最后都会编译成GPU可以理解的机器语言。

gpu阶段,最重要的两个shader:顶点着色器(vertext shader)和片元着色器(fragment shader)。

顶点着色器会对每个顶点调用。通常主要实现顶点的空间变换,传输UV。输入为顶点属性,用于描述表面的视觉特性,包括位置矢量,法矢量、漫反射颜色、高光颜色、纹理坐标。

片元着色器会对每个像素调用。得到的是上一个阶段对顶点信息插值的结果。通常完成纹理采样。

纹理

材质包括纹理和对应的shader。

纹理最初目的就是通过纹理映射把一张图黏在模型表面来表示模型的外观。纹理映射的坐标也称作UV坐标。

通常游戏里一个完整的模型渲染不会只有一张表面的纹理。会用更多的纹理来渲染出更逼真的效果。

法线贴图描述表面的法矢量方面,能表现表面凹凸的效果。渐变纹理来表现卡通渲染的大面积色块等。

光照渲染

光照的渲染是渲染的主要部分。标准光照模型中,一个像素点的颜色由自发光,高光反射,漫反射,环境光共同决定。

Updated: