《Shader入门精要》笔记——渲染流水线
前言
作者在序章部分提到,程序员的三大浪漫——编译原理、操作系统、图形学。
感觉总结得还挺有意思的,不过也确实说明了图形学的地位所在。
工作了一年,才开始学习这本书。之前零零碎碎也了解了不少渲染的知识,也看完了闫令琪老师的图形学课,感觉多多少少对图形渲染也有些基础的认知。但是偏偏却因为不会写Shader而无法上手。
希望自己能够坚持把这本书看完,既是对渲染知识的一个回顾和深化,又是对Shader的一个入门和上手。
然后这一章笔记,我加入了一些自己对于渲染管线的理解,综合书中所讲,作此文章。
概述
渲染流水线,即我们常说的渲染管线。也就是计算机把图形绘制出来的过程。
大部分书都会把渲染管线分为几个大的阶段,而且不同的书划分地可能不同。但总而言之,渲染管线具体干的事是绝对跑不了的,这些所谓的阶段不过只是用于划分渲染管线干的事罢了。
《Real-Time Rendering》是分为了三个阶段,应用阶段、几何阶段、光栅化阶段。
应用阶段
在应用阶段,主要是由开发者来主导,由CPU负责主要实现。
作为开发者,在这一阶段主要有3个任务:
一是准备好场景数据,即摄像机数据、物体数据、光源数据等等。
二是为了提高渲染性能,需要做一个粗粒度的剔除工作,把无需渲染的物体给剔除出去。
三是设置好每个物体的渲染状态,即材质、纹理、Shader等等。
最终生成的是图元信息,即点线面,这些图元会传递给到下一个阶段。
具体一点可以分成三个阶段:
首先,把数据加载到显存中。所谓显存,即显卡上的存储空间。一般来说,要渲染的数据首先会从硬盘加载到内存中,之后其网格和纹理由从内存中加载到显存中。为啥呢?因为大多数显卡无法直接访问内存,并且显卡访问显存速度非常快。
其次,设置渲染状态。所谓渲染状态,即如何渲染,如何着色。换句话说,就是用什么着色器、材质、光源等。
最后,调用DC。所谓DC,即CPU调用GPU渲染命令。
几何阶段
几何阶段主要是负责处理图元,包括顶点着色器、曲面细分着色器、几何着色器、裁剪剔除、屏幕映射等,最终会输出物体的屏幕坐标、深度、着色等信息给光栅化阶段进行处理。
顶点着色器的主要任务就是MVP坐标变化和顶点着色(高洛德着色)。MVP变化主要是把世界坐标转换到齐次裁剪坐标(-w到w的立方体),之后再由硬件做透视除法,最终得到归一化的设备坐标(-1到1的立方体)。
曲面细分着色器是一个可选的阶段,主要是用于细分图元。
几何着色器也是一个可选的阶段,主要是用于进行平面着色,以及用于产生更多的图元。
裁剪剔除阶段主要是将那些在屏幕外看不到的顶点进行裁剪,并且剔除掉看不见的面,比如背面剔除。这一阶段的剔除和裁剪是可控制的,可以通过指令控制裁剪区域,可以通过指令剔除正面还是背面。
在光栅化之前还有最后一个阶段,即屏幕映射。有些地方把这一阶段归属于光栅化的一部分,但干的事情都是一样的,即把每个图元坐标转换到屏幕坐标系中。具体过程是先把归一化的设备坐标(-1到1的立方体)忽略z轴形成-1到1的正方形坐标系,之后把-1到1的正方形坐标系映射到屏幕坐标系中(0到width/height的屏幕)。这里并不会对z轴进行任何处理,并没有舍弃z轴信息,z轴信息会当作深度值来进行后续的计算。
光栅化阶段
光栅化阶段主要是将物体信息进行处理,设置三角形,遍历三角形,最终生成各个片段信息。生成的片段信息经过片段着色器处理生成最终呈现在屏幕上的像素。(不包括后处理)
所谓设置三角形,即把传入过来的顶点信息转变为一个个三角形信息。
所谓遍历三角形,即检查每个像素是否被三角形网格所覆盖,如果被覆盖则会生成对于的片段(片元)信息。
片段着色器(片元着色器、像素着色器)是一个非常重要的阶段,因为这一阶段可以完成很多重要的渲染技术。
最后一个阶段,是合并操作阶段,也叫逐片元操作阶段。这一部分涉及到很多工作,如测试阶段(模板测试、深度测试)、混合阶段(Alpha混合)。需要知道的是,逐片元操作阶段是高度可配置的。
最终生成的屏幕像素值被存储在缓冲区中。有些GPU会使用双重缓冲的策略,即两个缓冲区,一个在前面显示,一个在后面计算。
小结
渲染管线中还有很多细节和策略这里都没有细说,主要是针对书中内容做的一个大概笔记。
推荐《Real-Time Rendering》图形学秘籍,图形学的财富密码,我感觉我应该是啃不完的,有兴趣的小伙伴可以尝试深读。