Shader "TA/ShaderDemoTwe"
{
Properties
{
_FronTexture("FrontTexture",2D) = "white" {}
_BackTexture("BackTexure",2D) = "white" {}
_Color("color",Color) = (1,1,1,1)
}
SubShader
{
Cull off
/*
Tags: 作用是告诉引擎如何去渲染我们的对象 语法格式如下:Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
SubShader中的Tags必须放置于SubShader中;
SubShader Tags中参数有以下这些:
Queue:渲染队列,指定对象什么时候渲染,每个队列其实都是利用一个整数进行索引的。
Background
值为1000,次队列的对象最先进行渲染。
Geometry
Queue的默认值,值为2000,通常用于不透明对象,比如场景中的物件与角色等。
AlphaTest
值为2450,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是美术的透贴。
Transparent
值为3000,常用于半透明对象,渲染时从后往前进行渲染,建议需要混合的对象放入此队列。
Overlay
值为4000,此渲染队列用于叠加效果。最后渲染的东西应该放在这里,例如镜头光晕等。
//"Queue" = "Geometry+1" //自定义写法
可以通过在值后加数字的形式来进行重新指定渲染队列。
渲染队列直接影响性能中的重复绘制,合理的队列可极大的提升渲染效率。在Unity中,渲染队列小于2500的对象都被认为是不透明的物体,
(如“Background”,“Geometry”,“AlphaTest”),这些物体是从前往后绘制的,而使用其他的队列(如“Transparent”,“Overlay”)的物体则是从后往前绘制的。
这意味着,我们需要尽可能地把物体的队列设置为不透明物体的渲染队列,而尽量避免重复绘制。
*/
Tags
{
"Queue" = "Geometry" //写法示例
/*
RenderType:自带以下值 :作用是可以利用Camera.SetReplacementShader来更改最终的渲染效果
Opaque
Transparent
TransparentCutout
Background
Overlay
TreeOpaque
TreeTransparentCutout
TreeBillboard
Grass
GrassBillboard
*/
"RenderType"="Opaque"
"IgnoreProjector" = "true"
"DisableBatching" = "false" // False(默认值),不禁用批处理 true:始终禁用此着色器的批处理 LODFading:仅当LOD激活时禁用批处理
// "ForceNoShadowCasting" = "true" //是否强制关闭投射阴影,值可为: True,强制关闭投射阴影False(默认值),不关闭投射阴影
"IgnoreProjector" = "true" //是否忽略Projector投影器的影响,Projector是Unity中内置的组件,可用于实现贴花等功能。true:使对象不受Projector影响 false 使对象受Projector影响
"CanUseSpriteAtlas"="False" //是否可用于精灵打包图集 ,意思就是如果某个图片精灵被设置为打包进图集时就会使其无法工作,相应的UI上也会有警告提示。
"PreviewType" = "Skybox" //
}
pass
{
CGPROGRAM
#pragma vertex vertexGet
#pragma fragment fragmentGet
#pragma target 3.0 //此功能仅从着色器模型3.0开始存在,因此着色器需要具有#pragma target 3.0编译指令。
sampler2D _FronTexture;
sampler2D _BackTexture;
struct appdata
{
float4 vertex : POSITION; // 顶点
float4 tangent : TANGENT; //切线
float4 normal : NORMAL; //法线
float2 texcoord : TEXCOORD; //uv1 因为后续用到为float2 所以这里定义为float2
float4 texcoord1 : TEXCOORD1; //uv2
float4 texcoord2 : TEXCOORD2; //uv3
float4 texcoord3 : TEXCOORD3; //uv4
float4 color : COLOR; //顶点色
/*
TEXCOORD0~N系列:例如TEXCOORD0、TEXCOORD1、TEXCOORD2...等等,主要用于高精度数据。
COLOR0~N系列:例如COLOR0、COLOR1、COLOR2...等等,主要用于低精度数据。
注:虽然这两种语义我们可以根据需要自由定义,但是,它并不是可以无限定义的,不同的GPU硬件有不同的数量限制。
以下为手机平台的常见规则:
OpenGL ES2.0支持最多8个
OpenGL ES3.0支持最多16个
从性能优化角度来讲,数量越少性能越好。另外,每个语义是4维向量,利用好这一点,可以大大节省总数量。
*/
};
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD;
};
v2f vertexGet(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
//VFACE: 双面材质 这种语义在Direct3D 9 Shader Model 3.0中可用。
//对于Direct3D 10及更高版本,请改用SV_IsFrontFace。
//Unity中都用VFACE
fixed4 fragmentGet(v2f i,float face:VFACE) : SV_TARGET
{
fixed4 col = 1;
col = face > 0 ? tex2D(_FronTexture,i.uv) : tex2D(_BackTexture,i.uv);
return col;
}
/*
Struct时,就可以通过下列语义来输出多个内容:
SV_Target0〜N 默认SV_TARGET0,也就是SV_TARGET,还有SV_TARGET1,SV_TARGET2...这个在需要输出多个RenderTarget时很有用。
SV_Depth一般情况下,模型的像素深度值在光栅化时会自动插值计算得出,并不需要我们做额外的处理,但这并不代表不可以修改它,
通过在片断着色器中输出SV_DEPTH语义可以更改像素的深度值。
注意!!!此功能相对会消耗性能,在没有特别需求的情况下尽量不要用!
*/
ENDCG
}
}
}
持续学习中~ 有共同兴趣的新手 可以一起讨论~