所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。
Shader大体上可以分为两类,简单来说
表面着色器(Surface Shader) - 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果。类比卡片机,上手以后不太需要很多努力就能拍出不错的效果。
片段着色器(Fragment Shader) - 可以做的事情更多,但是也比较难写。使用片段着色器的主要目的是可以在比较低的层级上进行更复杂(或者针对目标设备更高效)的开发。
因为是入门文章,所以之后的介绍将主要集中在表面着色器上。
注意到网上的Shader代码中的最后一行FallBack "Specular"没有?该语句的意思是如果没有找到适合该Shader的硬件,那么自动匹配Unity3D自带的Specular Shader。那么答案就很清楚了:Unity3D自带的Shader必须全面的针对几乎所有可能出现的硬件,所以要添加尽量多的分支来满足要求。每一个分支匹配不同的硬件。而网上下载的Shader往往只需要考虑几种硬件就可以了。一般Shader作者会标明是否匹配移动平台,适应OpenGL ES1,2,3还是需要DX11支持等信息。如果没有标明那么你就只能自己尝试了。
学习方法
(1)由简入繁:自己写Shader,从最简单写起,简单的测试通过了,再一点点往里加。
(2)多调试:例如,有一个float变量x。假如x范围是[0,1],则在frag片段函数里输出 float4(x,0,0,1)的颜色,以红色的深浅来观察x的值;如果x范围是[0,1000],则可在frag片段函数里输出 float4(x/1000,0,0,1)的颜色。方法就这么简单,具体根据需要去调整。
(3)结合查看UnityCG.cginc等文件,以及unity的自带Shader,即Build-in Shader。
Build-in Shader下载地址
(4)看看书:建议看本教程的同时,多看看书。推荐英文的The CG Tutorial,也就是中文版的Cg教程_可编程实时图形权威指南
相关教材链接
学习小技巧
(1)查看UnityCG.cginc等文件
使用Vertex and Fragment的CG时,会#include "UnityCG.cginc",用到里面的很多函数,如TRANSFORM_TEX,UNITY_TRANSFER_DEPTH等函数的定义。那么怎么查看这些定义呢?
windows路径:Unity\Editor\Data\CGIncludes
mac路径:右键点击unity图标->show contents->Data->CGIncludes
该文件夹下有Unity关于Shader的库,如UnityCG.cginc,UnityCG.glslinc,Lighting.cginc等。打开
UnityCG.cginc(写字板MONODev等均可),后即可查看相关函数的定义。
(2)电子书的学习技巧
中文电子书,学起来快,好理解,但大多数是影印版。
英文电子书,可以很好的用关键词搜索知识点。
(3)使用#prama only_renderers d3d9 , 限定编译平台。(3)(4)配合使用效果更好
(4)打开编译后的Shader,查看对应的汇编代码或者OpenGL ES代码。
方法:左键单机shader文件,然后在Inspector面板里点击Open Compiled Shader.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)