说在最前
首先,我不介绍shader干嘛的以及有什么用,直接都是干货。
那么首先从在unity中创建一个shader说起,与创建c#脚本相同,新建一个shader,然后选择shader的类型,这个类型随便选,一般是选择片面着色器。新建好shader之后,再新建一个材质球,shader的展示一般都是通过材质球来体现的
下面说一下shader的语法与结构
关键字:Shader,不管你的shader代码文件里面有多少行代码,都是通过shader这个关键字开始的。
Shader "Jtro/shader_mb"
{
//首先声明一些参数
Properties{
_MainTex ("Base(RPG)",2D) = "white" {}
}
//子shader,一般有多个子shader,因为许多型号的pc、手机的配置多样,这时系统会根据硬件的配置选择一个最适合的子shader使用
SubShader
{
}
//回滚,如果子shader没有一个是适用当前的平台,那么就启用回滚,这个是保证在平台运行的时候有一个shader启用
FallBack "Diffuse"
}
一般的一个shader文件中会有多个subshader代码块,为什么呢,因为现实中每个人用的显卡不尽相同,显卡的种类千差万别,为了让玩家能看到最好的效果,就会写若干个子shader代码块,一般写两三个就够了,一个是针对目前最流行的显卡,一个针对老旧的显卡
shader中最重要的标签(Tags{})
//这个是重要标签,Tags{}块
Tags {"Queue"= "Geometry""RenderType"= "Opaque""IgnoreProjector"= "True"}
/*
Queue就是队列的意思,在这里就是渲染队列的意思
RenderType
IgnoreProjector
*/···
Subshader中的pass块,subshader中包装了一个渲染方案,而这些方案都是由一个个Pass块来执行的,subshader中同样的也可以包含多个pass代码块。
SubShader
{
//这个是重要标签,Tags{}块
Tags {"Queue"= "Geometry""RenderType"= "Opaque""IgnoreProjector"= "True"}
/*
Queue就是队列的意思,在这里就是渲染队列的意思
RenderType
IgnoreProjector
*/
Pass
{
Name "YINYONG"//这里的名字必须全部大写
Material
{
Diffuse (1,0.7,0.7,1)
Ambient (1,0.7,0.7,1)
}
Lighting On
SetTexture[_]{combine primary}
}
}
这里有一个重要的功能,引用其他shader文件中的代码块,这样就可以减少重复劳动,
Subshader {
SubShader {
UsePass "路经:/pass代码块名称"
}
}
最后一个是回滚操作,这里注意,在开发的时候一般不适用回滚,只有在实际应用发布时才会为了追求平台最大适用性而加上
在unity的shader编写中,可以使用2中语言来写
第一种是:GLSL, 如果使用了GLSL来写,这些代码必须位于GLSLPROGRAM和ENDGLSL之间
第二种是:cG/HLSL,如果使用了cG/HLSL,这些代码必须位于CGPROGRAM和ENDCG之间
本文集使用的是cg语言。
网友评论