考虑到后面需要写一些更高级复杂的shader,所以这段时间就来一些图形渲染原理以及源码讲解。
主因是昨天晚上写完一个游戏中常用的shader范例,准备写详细注释和讲解博文的时候,发现涉及到的知识点太多了,不得不优先来说明(就跟打预防针一样)。花这么多时间写这一系列博客的目的是为了让看的人(包括以后的我)能最通俗易懂的理解图形学和shader开发。曾几何时我为了学习图形学,在网上和书店找了很多资料,但是阅读这些资料的前提都是建立在已有一定的图形学学习或者研究基础上的,而有的资料还是大量原封不动的抄写出来的(所谓天下文章一大抄嘛),甚至有一些资料单纯的就是作者为了秀自己的技术(或者别人的技术),而实际的原理算法细节完全就没有,我觉得我这种学习方式虽然也能通过反复钻研得到自己需要的知识,但是过程太过迂回,而且存在理解盲区。所以呢我就准备把自己当成一个小白,从零到一的学习开发shader。
下面我们来观察最常用的unity cg内置源码的结构和意义,这个真的非常重要,这就跟我们刚开始学习unity引擎去查看monobehaviour一样的,let's begin。
首先下载unity内置着色器文件,地址:下载
解压后打开CGInlcudes文件夹,会发现一系列后缀为.cginc的源文件,这个就是unity cg runtime的源码了,接下来根据我的“常用度”来排序讲解,如下(只举例常用):
1.UnityCG.cginc(这名字很点题吧,基本上就是最重要的类了)
①.struct appdata_base/appdata_tan/appdata_full unity提供的vertex顶点函数形参表,我们可以全部传入或者根据语义绑定传入需要的字段。
②.float4 UnityWorldToClipPos( in float3 pos ) 世界空间变换到裁剪空间函数,属于渲染流程中顶点变换过程,这个好理解。
③.float4 UnityViewToClipPos( in float3 pos ) 视口空间变换到裁剪空间坐标。
④.float3 UnityObjectToViewPos(float4 pos) 建模空间变换到视口空间坐标。
⑤.float3 UnityWorldToViewPos( in float3 pos ) 世界空间到视口空间坐标。
⑥.float3 UnityWorldSpaceLightDir( in float3 worldPos ) 世界空间中顶点坐标到光源坐标的朝向向量。
⑦.float3 UnityWorldSpaceViewDir( in float3 worldPos ) 世界空间中顶点坐标到视口坐标的朝向向量。
⑧.#define TANGENT_SPACE_ROTATION 定义一个建模空间到切线空间的变换rotation矩阵。
⑨.fixed3 UnpackNormal(fixed4 packednormal) 采样法线纹理函数。
⑩.float4 ComputeScreenPos(float4 pos) 获得一个顶点在屏幕空间中信息封装,多用于后期纹理采样。
......还有很多函数有待学习,同学们可以一一查看。
2.UnityShaderVariables.cginc(顾名思义了,就是字段封装类)
①.UNITY_MATRIX_MVP(UNITY_MATRIX_XXX) mvp变化矩阵,源码中还有一系列矩阵,就不一一列举了。
②._Time 时间封装字段,还有一系列时间封装,把文件浏览一遍。
③._ProjectionParams/_ScreenParams/_ZBufferParams 投影/屏幕/深度封装字段。
④._WorldSpaceLightPos0/unity_LightPosition[8] 世界空间/视口空间光源坐标。
⑤.unity_ObjectToWorld/unity_WorldToObject 建模-世界/世界-建模矩阵,常用于顶点计算中。
⑥.unity_FogColor 雾的颜色。
......还有好些字段,暂时使用的比较少。
3.Lighting.cginc(unity的光照了,涉及到光照计算)
①.SurfaceOutput结构体 unity CG独有的surface shader中输出传递给光照模型的表面信息结构体。
②.fixed4 UnityLambertLight (SurfaceOutput s, UnityLight light) surface shader中提供使用的光照模型计算函数,下面还有一堆。
......后面还有一系列光照相关函数。
这就是最重要的三个大类了,基本上常用的shader开发只需要使用这三个大类中的字段及函数即可,当然整个CGIncludes文件夹建议全部阅读一遍(虽然有一些确实用不上)。
先写到这里,下一篇对后面我要写的shader特效的图形渲染原理来一些讲解。以后再需要的时候就对unity CG其他内置源码进行学习理解。
so,我们接下来继续。