Unity Shader入门精要学习笔记
来源:互联网 发布:电脑桌面工作计划软件 编辑:程序博客网 时间:2024/06/11 21:24
Unity Shader入门精要学习笔记 - 第2章 渲染流水线
本系列为UnityShader入门精要读书笔记总结,
原作者博客链接:http://blog.csdn.net/candycat1992/article/
书籍链接:http://product.dangdang.com/23972910.html
第2章 渲染流水线
2.1 综述
渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。它的输入是一个虚拟摄像机、一些光源、一些Shader以及纹理等。
渲染流程分成3个阶段:应用阶段、几何阶段、光栅化阶段。
应用阶段:
这个阶段开发者主导,通常由CPU负责实现。
在这个阶段三个主要任务:
首先,准备好场景数据,例如摄像机的位置、场景中模型、使用光源等;
其次,粗粒度剔除工作,剔除不可见物体,省去后续几何阶段进行处理;
最后,设置好每个模型的渲染状态。这些渲染状态包含材质、纹理、Shader等。
输出的是渲染所需的几何信息,即渲染图元,这些渲染图元将被传递给下一阶段:几何阶段。
几何阶段:(对应的顶点函数)
几何阶段通常在GPU上进行,负责和每个渲染图元打交道,进行逐顶点、逐多边形的操作。
几何阶段的一个重要任务就是把顶点坐标变换到屏幕空间中, 再交给光栅器进行处理。
这一阶段将会输出屏幕空间的二维顶点坐标、 每个顶点对应的深度值、 着色等相关信息, 并传递给下一个阶段。
光栅化阶段: (对应的片元函数)
这一阶段将会使用上个阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像。
这一阶段也是在GPU上运行。
光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。它需要对上个阶段得到的逐顶点数据进行插值,然后再进行逐像素处理。
2.2 CPU和GPU之间的通信
渲染流水线的起点是CPU,即应用阶段。大致分为三个阶段:
(1) 把数据加载到显存中
(2) 设置渲染状态
(3) 调用Draw Call
把数据加载到显存中:
所有渲染所需的数据都需要从硬盘中加载到系统内存中。然后,网格和纹理等数据又被加载到显卡的存储空间——显存中。真实渲染中需要加载到显存中的数据往往比图所示复杂许多。 例如, 顶
点的位置信息、 法线方向、 顶点颜色、 纹理坐标等。
设置渲染状态:
渲染状态通俗的解释是,这些状态定义了场景中的网格是怎样被渲染的。
例如,使用哪个着色器、光源属性、材质等。
如果我们没有更改渲染状态,那么所有的网格都将使用同一种渲染状态,如下图显示了当使用同一种渲染状态时,渲染3个不同网格的内容。
准备好上述工作后,CPU会调用渲染命令Draw Call来告诉GPU开始渲染。
调用Draw Call:
Draw Call 实际上是一个命令,它的发起方是CPU,接收方是GPU。
这个命令仅仅会指向一个需要被渲染的图元列表,而不会再包含任何材质信息——这是因为我们再上个阶段中完成了。
当给定了一个Draw Call 时,GPU就会根据渲染状态和所有输入的顶点数据来进行计算,最终输出成屏幕上显示的那些漂亮的像素。而这个过程,就是GPU 流水线。
2.3 GPU 流水线
几何阶段和光栅化阶段,开发者无法拥有绝对的控制权,其实现的载体是GPU、GPU通过实现流水线化,大大加快了渲染速度。
几何阶段和光栅化极端可分成若干更小的流水线阶段。
绿色:完全可编程
黄色:可配置不可编程
蓝色:流水线固定实现
实线的框:开发者必须编程实践
虚线的框:可选的
顶点着色器(Vertext Shader)是完全可编程的,它通常用于实现顶点的空间变换、顶点着色等功能。
曲面细分着色器(Tessellation Shader)是一个可选的着色器,它用于细分图元。
几何着色器(Geometry Shader)是可选的着色器,用于执行逐图元的着色操作,或者产生更多的图元。
下一个流水线阶段是裁剪,这一阶段的目的是将不在摄像机视野内的顶点裁减掉,并剔除某些三角图元的面片。这个阶段是可配置的。
几何概念阶段中的最后一个流水线阶段是屏幕映射。这一阶段是不可配置和编程的,它负责把每个图元的坐标转换到屏幕坐标系中。
光栅化概念阶段中的三角形设置和三角形遍历阶段也都是固定函数的阶段。接下来的片元着色器,则是完全可编程的,它用于实现逐片元的着色操作。最后逐片元操作阶段负责执行很多重要的操作,例如修改颜色、深度缓冲、进行混合等,它是不可编程的,但具有很高的配置性。