好久没有写博客了,一直被各种事情所耽搁(其实就是懒)。好了,废话不多说,这回又开新坑了,预计100年内完。这一次写Shader主要还是为了自己以后忘掉某些知识点,(本人很笨的好不好,属于过目就忘完全不记得以前干过什么)我会以一个新手来写这个Shader教程(你自己就是一个新手好不好)。
我学shader的时候都是很散的教学,前面还是新手教学,后面就是超复杂的例子,完全不会好不好,国内好多Shader教程要不内容比较分散,要不就是跨度非常大,对与向我这样的新手很不友好。国外的教程吗......完全看不懂啊。
接下开就是正题了,对了,如果你是shader大神你就可以右上了,看我写的东西就是在浪费生命。
Shader的原理
我不会说一些GPU向CPU传递什么什么的东西,这些我一个都不说。想要知道的话自己去搜,有很多。
Shader的一些基础
unity shadr简单来说分为两类,
- 表面着色器(Surface Shader)-----unity为你做了大部分的工作,只需要简单的写写即可实现很多不错的效果。但可以实现的功能没有顶点片元着色器的多。
- 定点片元着色器(Fragment Shader)-----可以做的事情更多,但相对的也比较难写。
Shader程序的基本结构
虽然这是一个入门篇,但我不会介绍表面着色器,所以上来就是定点片元着色器。
先看看语法的基本结构把
Shader "顺/基本结构"{//这里定义Shader的名字,可以随便起 Properties{ //这里写属性,可以没有 } //SubShader可以写很多个 显卡运行效果的时候,从第一个SunShader开始,如果第一个SubShader里面的效果都可以实现运行,那么就使用第一个SubShader,如果显卡这个SunShader里面某些效果它实现不了,它会自动去运行下一个SubShader SubShader{ //至少有一个Pass块 Pass{ //在这里编写Shader代码 HLSLPROGRAM CGPROGRAM //使用CG语言来编写Shader代码 ENDCG } } Fallback "Diffuse" //当上面的所有的SubShader显卡都不支持就启用Fallback的着色器。这就是一个备用方案,可以没有 }
我的第一个Shader
Shader "顺/我的第一个Shader"{ Properties{ } SubShader{ Pass{ CGPROGRAM //顶点函数 这里只是声明了,定点函数的函数名 //基本作用是完成定点坐标从模型空间到裁剪空间的转换(从游戏环境转换到视野相机屏幕上) #pragma vertex vert //片元函数这里只是声明了,片元函数的函数名 //基本作用 返回模型对应的屏幕上的每一个像素的颜色值 #pragma fragment frag float4 vert(float4 v : POSITION) : SV_POSITION{//通过语义告诉系统,我这个参数是干嘛的,比如POSITION是告诉我系统我需要定点坐标 //SV_POSITION这个语义用来解释说明返回值,意思是返回值是裁剪空间下的顶点坐标 return UnityObjectToClipPos(v); } fixed4 frag() : SV_Target{ return fixed4(0.54,0.45,0.98,1); //这里返回的是一个颜色值RGBA,你可以改变参数来改变颜色,参数范围变化是0到1 } ENDCG } } Fallback "Diffuse" }
上面写的“Properties{ }”可以删除,现在还没用到,以后会用到的。
累了,下次在写,有时间的话,会在一对上面的东东细讲的。