《Shader入门精要》笔记——渲染流水线

《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》图形学秘籍,图形学的财富密码,我感觉我应该是啃不完的,有兴趣的小伙伴可以尝试深读。

上一篇:[UnityShader基础]17.shader优化


下一篇:OpenGl面试题(持续更新)