- Unity 3D 内建着色器源码剖析
- 熊新科
- 11字
- 2020-08-27 16:35:02
第1章 实时3D渲染流水线
1.1 概述
在计算机体系结构中,管线(pipeline)可以理解为处理数据的各个阶段和步骤。3D渲染流水线(render pipeline)接收描述三维场景的数据内容,经过若干阶段的处理,将其以二维图像的形式输出。渲染流水线有多种,本章讨论的是基于光栅器插值(rasterizer interpolation)的实时3D渲染流水线。
目前主流的实时3D渲染流水线有Direct 3D和OpenGL。这两种流水线在具体的实作上大体相同,但细节上的差异也很明显。因为Unity 3D是一个跨平台引擎,所以本章讨论的渲染流水线也不局限于某一家具体的实作,而是讨论各个实作共同的阶段和机制。在深入探讨时,也会分析Direct3D与OpenGL的差异。
渲染流水线一般可以分为如下阶段:顶点处理(vertex processing)、光栅化(rasterization)、片元处理(fragment processing)和输出合并(output merging)。顶点处理阶段对存储在顶点缓冲区(vertex buffer)中的各顶点执行各种操作,如坐标系变换等。光栅化阶段对由顶点构成并变换到裁剪空间(clip space)的多边形进行扫描插值,将这些多边形转换成一系列的片元集合。片元(fragment)是指一组数据值,这些数据最终用于对颜色缓冲区(color buffer)中的像素(pixel)颜色值、透明值,以及深度缓冲区(depth buffer)中的深度值进行更新。片元处理阶段对各个片元进行操作,确定每个片元的最终颜色值和透明值。输出合并阶段则是对片元与颜色缓冲区中的像素进行比较或合并操作,然后更新像素的颜色值和透明值。
实时3D渲染流水线发展至今已经很成熟,而且其组成阶段比上述4个阶段要多一些。尽管如此,上述4个阶段仍然是每一家实时3D渲染流水线实作的主要内容。其中,顶点处理与片元处理两个阶段是可编程的(programmable)。针对这些阶段的、由GPU执行的相关程序称为顶点着色器(vertex shader)和片元着色器(fragment shader)。顶点着色器可针对顶点执行任何转换操作;片元着色器可针对片元用各种方式决定其最终颜色值和透明值。图1-1所示为渲染流水线的基本阶段和流程,其中顶点处理阶段和片元处理阶段是可编程控制的;而光栅化阶段和输出合并阶段则由硬件以固定不可编程的方式实现。
▲图1-1 渲染流水线的基本阶段和流程