凹凸
//法线
Shader"Custom/MyCustomSufaceShader2"{
Properties{
_MainTex("主纹理",2D)="white"{}
_NormalMap("法线纹理",2D)="white"{}
}
SubShader{
Tags{"RenderType"="Opaque"}
LOD200
CGPROGRAM
//PhysicallybasedStandardlightingmodel,andenableshadowsonalllighttypes
#pragmasurfacesurfStandardfullforwardshadows
//Useshadermodel3.0target,togetnicerlookinglighting
#pragmatarget3.0
sampler2D_MainTex;
sampler2D_NormalMap;
structInput {
float2uv_MainTex;
float2uv_NormalMap;
};
voidsurf (Input IN,inoutSurfaceOutputStandard o) {
o.Albedo=tex2D(_MainTex,IN.uv_MainTex).rgb;
float4uv_n=tex2D(_NormalMap , IN.uv_NormalMap);
o.Normal=UnpackNormal(uv_n);
}
ENDCG
}
FallBack"Diffuse"
}
透明
Shader"Custom/MyCustomSufaceShader"{
Properties{
_Alpha("Alpha",Range(0,1))=1
}
SubShader{
Tags{"RenderType"="Transparent"}
LOD200
CGPROGRAM
//PhysicallybasedStandardlightingmodel,andenableshadowsonalllighttypes
#pragmasurfacesurfStandardfullforwardshadowsalpha
//Useshadermodel3.0target,togetnicerlookinglighting
#pragmatarget3.0
structInput{
float4_clolor:COLOR;
};
half_Alpha;
voidsurf(Input _in,inoutSurfaceOutputStandard o){
o.Albedo=(0.5,0.5,0.5);
o.Alpha=_Alpha;
}
ENDCG
}
FallBack"Diffuse"
}
边缘发光
//RimShader
Shader"Custom/MyCustomSufaceShader3"{
Properties{
_MainTex("主纹理",2D)="white"{}
_NormalMap("法线纹理",2D)="white"{}
_RimColor("边缘光的颜色",Color)=(1,1,1,1)//白色
_RimPower("边缘光的强度",float)=1
}
SubShader{
Tags{"RenderType"="Opaque"}
LOD200
CGPROGRAM
//PhysicallybasedStandardlightingmodel,andenableshadowsonalllighttypes
#pragmasurfacesurfStandardfullforwardshadows
//Useshadermodel3.0target,togetnicerlookinglighting
#pragmatarget3.0
sampler2D_MainTex;
sampler2D_NormalMap;
fixed4_RimColor;
half_RimPower;
structInput {
float2uv_MainTex;
float2uv_NormalMap;
fixed3viewDir;
};
voidsurf (Input IN,inoutSurfaceOutputStandard o) {
o.Albedo=tex2D(_MainTex,IN.uv_MainTex).rgb;
float4uv_n=tex2D(_NormalMap , IN.uv_NormalMap);
o.Normal=UnpackNormal(uv_n);
float3dotV=dot(normalize(IN.viewDir),o.Normal);
floattemp=saturate(dotV);
floatrim=1-temp;
o.Emission=_RimColor*pow(rim,_RimPower);
}
ENDCG
}
FallBack"Diffuse"
}
* "Queue"标签。定义渲染顺序。预制的值为
* "Background"。值为1000。比如用于天空盒。
* "Geometry"。值为2000。大部分物体在这个队列。不透明的物体也在这里。这个队列内部的物体的渲染顺序会有进一步的优化(应该是从近到远,early-z test可以剔除不需经过FS处理的片元)。其他队列的物体都是按空间位置的从远到近进行渲染。
* "AlphaTest"。值为2450。已进行AlphaTest的物体在这个队列。
* "Transparent"。值为3000。透明物体。
* "Overlay"。值为4000。比如镜头光晕。
* 用户可以定义任意值,比如"Queue"="Geometry+10”
* "RenderType"标签。Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader或Camera.SetReplacementShader配合使用。Unity内置的RenderType包括:
* "Opaque":绝大部分不透明的物体都使用这个;
* "Transparent":绝大部分透明的物体、包括粒子特效都使用这个;
* "Background":天空盒都使用这个;
* "Overlay":GUI、镜头光晕都使用这个;
* 用户也可以定义任意自己的RenderType这个标签所取的值。
* 应注意,Camera.RenderWithShader或Camera.SetReplacementShader不要求标签只能是RenderType,RenderType只是Unity内部用于Replace的一个标签而已,你也可以自定义自己全新的标签用于Replace。
比如,你为自己的ShaderA.SubShaderA1(会被Unity选取到的SubShader,常为Shader文件中的第一个SubShader)增加Tag为"Distort"="On",然后将"Distort"作为参数replacementTag传给函数。此时,作为replacementShader实参的ShaderB.SubShaderB1中若有也有一模一样的"Distort"="On",则此SubShaderB1将代替SubShaderA1用于本次渲染。
* 具体可参考Rendering with Replaced Shaders
float3 viewDir 包含了视角的观察方向,主要用于计算视差效应(Parallax effects ),边缘光照,等等。
float4 COLOR 包含了经过内插值(interpolated )的每个顶点的颜色值。
float4 screenPos 包含了用于反射效果的屏幕坐标系的位置信息。例如,在Unity专业版的WetStreet shader中使用了它。
float3 worldPos 包含了世界坐标系中的位置。
float3 worldRefl 包含了世界坐标系中的反射向量,如果Surface Shader没有重写o.Normal。参考Reflect-Diffuse shader。
float3 worldNormal 包含了世界坐标系中的法线向量,如果Surface Shader没有重写o.Normal。
float3 worldRefl;
INTERNAL_DATA 包含了世界坐标系的反射向量,如果Surface Shader重写了o.Normal。为了得到基于逐像素的法线贴图的反射向量,请使用WorldReflectionVector (IN,o.Normal) 。参考Reflect-Bumped shader。
float3 worldNormal;
INTERNAL_DATA 包含了世界坐标系的发现向量,如果Surface Shader重写了o.Normal。为了得到基于逐像素的法线贴图的法线向量,请使用WorldNormalVector (IN,o.Normal) 。参考Reflect-Bumped shader。