写Shader程序有三种方式,一是固定管线(由于过于古老且无法发挥现代显卡的效果几乎被弃用了),二是经典的vertex,fragment算法,三是Unity自带的 surface shader(同时也是我推荐使用的一种方法,简单,易复用).
想学好unity shader 对于固定管线的理解可以说是所有的基础,其次就是基础的编写语言CG/LSGL了,然后依靠时间去慢慢的理解各种应用方案以及光学知识,数学基础等.不过个人感觉需要的数学知识并不难,真正难得是它的各种效果体系的复杂.
好了,我就不多说了,现在开始写我的第一篇复习,关于漫反射可以说是在生活中无处不在的效果了,所以想要有一个好的渲染效果,漫反射是离不开的.先上代码.
Shader"myDiffuse"
{
Properties//(1)
{
_MainTex("Base(RGB)",2D)="white"{}
}
SubShader//(2)
{
Tags{"RenderType"="Opaque"}//(3)
Lod 200//(4)
CGPROGRAM
#pragma Surface surf Lambert//(5)
sampler2D _MainTex;//(6)
struct Input//(7)
{
float2 uv_MainTex//(8)
};
void surf(Input IN,inout SurfaceOutput o)//(9)
{
half4 c = tex2D(_MainTex,IN.uv_MainTex);//(10)
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack"Diffuse"//(11)
}
按照我程序里标好的序号,come on.
(1)这里是属性块,在这里建立程序和外部的连接,可以和轻松的调整渲染属性,如下图(随意找了一张图,懒得再截取了,请原谅神临的懒惰,嘿嘿):
(2)一个shader中至少有一个SubShader,其实就是专门针对某个设备进行编程的存在,本人向来只写一个,两个的时候很少,嗯….我承认自己很懒的…
(3)这个是标签,可以定义许多属性,至于有什么,很麻烦的,这里要记许多,感觉自己都没记清楚,至于是什么,可爱的你网上查吧.
(4)这个应该都很熟悉就对了,只不过我感觉这里的LOD和unity的LOD是两个东西,一个是在应用程序阶段进行改变,另一个是在图像编程的时候进行改变,对节省消耗有很大的意义,据说还可以利用这个完成一些奇奇怪怪的效果.
(5)这里是引用内建的Lembert光照模型(漫反射),想看看具体是啥可以去内置CG中去看看,这个是基础一定要看的哦.下面是内建光照模型,这里贴出来,Lighting是人家的格式要求,必须要写的,神临真想说,要是我设计的shader,一定要把这个Lighting去掉,好麻烦的.不过现在还是扎扎实实的学吧,任重而道远!!
至于这里的计算其实就是利用了dot函数里 cos 的角度越大值越小的效果计算出来的,具体的可以在网上找找哦.
(6)建立变量,要和属性的命名一致哦,否则没办法引用窗口上的属性.
(7)输入输出结构体,能够将程序中得到的参数传递到着色器上,从而参与计算,里面的参数是有规定的,同样的,记得去看内置CG中的具体内容.
(8)映射贴图的UV坐标,只有这样,在后续才能采样后准确的赋予某个物体贴图颜色.
(9)表面函数,从INPUT中接收到的数据,要经过这里的计算转入光照模型中才能得到效果.
(10)贴图采样计算,这里unity已经帮我们建立好了函数,只要大胆的用tex2D方法就行了,省去了很大写重复代码的时间
(11)这里是一个回调同时也是一个补充,当写的所有shader都不能执行,或者缺少比如阴影之类的东西时,它会起到保护和补充的作用.
好了,就先到这里了,下次再继续,本人要下班了,虽说上班时间写这个被老板发现的后果很严重,但是手痒痒就写了,吾辈中人,应当敢于面对惨淡的人生!!!