最近由于工作变动开始学习Shader。虽然本科学过计算机图形学和数字图像处理,但是由于学完后基本没有实践,所以也忘得差不多了,只好从基础开始一点点捡起来。
这篇笔记主要记录在阅读人民邮电出版社出版的冯乐乐的《Unity Shader入门精要》时遇到的一些问题以及重点难点,方便以后复习和查缺补漏。
至于Cg、HLSL、GLSL,它们的关系就跟C、Java、Python类似,只是Shader编程的不同语言,且差异并不大,具体问题在实践时解决即可。

第二章 渲染流水线

本章中主要需要掌握渲染流水线,渲染管线,GPU流水线这三个概念。
渲染流水线包含三个阶段,应用阶段->几何截断->光栅化阶段。这三个阶段是对实际渲染过程中各个步骤的一个逻辑上的划分,可以适用于任何架构的渲染体系。
本书中并未出现渲染管线的概念,而网络上许多资料也会混淆这三者的概念,将渲染管线当作渲染流水线或GPU流水线介绍。而在实际工作中及许多专业资料中又常常提及渲染管线的概念,所以有必要明确渲染管线的定义。
在查阅百度百科后发现,百度百科也是将渲染管线和渲染流水线作为一个东西来介绍的。所以可以确定在一定程度上将这两个东西当作一个东西是没有问题的。同理,本书中虽然将渲染流水线和GPU流水线作为两个东西介绍,其实这两个东西也可以指同一个东西,这本书中介绍的GPU流水线只不过是渲染流水线的细化,包含了完整的渲染过程中需要的步骤。
综上,可以将渲染管线、渲染流水线、GPU流水线作为等价的名词来看待,当然也需要知道渲染管线中粗略划分的逻辑阶段(渲染流水线)和细分后的各个阶段(GPU流水线)。这些对理解后面的知识是必要的。
GPU流水线中需要重点掌握的是顶点着色器和片元着色器,它们之所以重要是因为整个GPU流水线中只有它们是可编程的,由于我们的目标是学习shader,那么由机器实现的且不可编程的部分对我们来说只需要了解即可。而如果你是一位硬件工程师,那么GPU流水线中的其它部分也必须要掌握。
顶点着色器和片元着色器在后面的学习中也是重中之重,务必掌握。
最后总结,Shader所在的阶段是渲染管线中的一部分,是其中高度可编程的阶段。Shader编译后的代码将在GPU上运行,并影响最终屏幕上显示的结果。

第三章 Unity Shader 基础

这章中Unity Shader的结构比较重要,而初学者刚开始看肯定多少有些理解不到位(没错就是我),没有关系,在后面的学习中即使不想理解也会理解。
Unity Shader总体来说分为三大部分。
第一部分是Properties,在Properties中可以定义变量,用于之后的代码中,而在Properties定义的变量可以通过在Unity的Editor中直接更改。
第二部分是SubShader。SubShader是三个部分中最重要的部分,可以理解为其他高级语言中的程序部分,对渲染管线中一些部分的定制将在这部分内完成。一个SubShader中可以定义多个Pass,对应着不同需求的功能,程序员需要在合适和时机调用合适的Pass来达成目的。
第三个部分是FallBack,其作用跟else差不多。当找不到合适的Pass调用时,会在FallBack指定的Shader中寻找可调用的Pass,这一调用过程是可以迭代的。
而之前所说的可以被编程的顶点着色器及片元着色器,它们要在SubShader下或Pass下被实现,并且在Pass中被指定。