这里不废话,直接把着色器最常用的内置代码列出,以便快速查阅。

UnityObjectToClipPos(float4 v)

把顶点从模型空间转裁剪空间。基本上着色器必用。

TRANSFORM_TEX(uv,tex)

应用纹理缩放和偏移。

float4 tex2D(tex,uv)

贴图采样。

mul(unity_ObjectToWorld,v.vertex)

把顶点坐标从模型空间转世界空间,漫反射、高光反射都要用。

float3 UnityObjectToWorldNormal()

法线,模型转世界。漫反射、高光反射都要用。

float4 _WorldSpaceLightPos0

从顶点指向光源的世界方向。漫反射、高光反射都要用。

float4 _LightColor0

float4 UNITY_LIGHTMODEL_AMBIENT

环境光。

float3 _WorldSpaceCameraPos

高光反射用。

ObjSpaceLightDir(float4 v.vertex)

法线贴图,用于把光方向从世界空间到模型空间,为转换到切线空间做准备。(未归一化)

ObjSpaceViewDir(float4 v.vertex)

(未归一化)

float3 UnpackNormal(float4)

输入从法线贴图采样的值,得到切线空间下的法线方向。

float3 UnityObjectToWorldDir(float4)

法线贴图,在世界空间计算时,用于把切线转换到世界空间。

clip(col.a-_Cutoff);

用于此像素alpha小于某阈值时直接不渲染。

需要配合

SubShader
{
    Tags { "Queue"="AlphaTest"
    "IgnoreProjector"="True"
    "RenderType"="TransparentCutout" }

接收阴影:

SHADOW_COORDS(3)

放在v2f里,输入的数字是TEXCOORD的序号。

TRANSFER_SHADOW(o)

放在顶点着色器,输入是输出的v2f。

SHADOW_ATTENUATION(i)

放在片元着色器,输入输入的v2f,返回fixed3。(不要和fixed4相乘)

投射阴影

Tags{"LightMode"="ShadowCaster"}

在Pass打上此标签。

V2F_SHADOW_CASTER;

v2f加这个。

TRANSFER_SHADOW_CASTER_NORMALOFFSET(o);

放在顶点着色器,输入是输出的v2f。

SHADOW_CASTER_FRAGMENT(i);

放在片元着色器。

启用透明效果的几个条件

"Queue"="Transparent"

"RenderMode"="Transparent"

ZWrite Off

Blend SrcAlpha OneMinusSrcAlpha(如果不写默认是Off)

输出颜色的alpha不是1

其实只有后两个是真正决定半透明开启的,前3个则是保证半透明效果正确。如果看几个非典型设置:

"Queue"="Geometry" "RenderType"="Opaque" ZWrite On Blend SrcAlpha OneMinusSrcAlpha 输出颜色的alpha不是1

比如后2个都按半透明设置,但是深度写入开启,且在不透明渲染队列,它会把后面的物体都剔除,看起来好像不透明了,但对着天空盒看还是透明的。其实它“挡住”物体的部分也不是挡住了,而是它和地面天空盒的混合。

"Queue"="Geometry" "RenderType"="Opaque" ZWrite Off Blend SrcAlpha OneMinusSrcAlpha 输出颜色的alpha不是1

我们可以推理一下,它和不透明一起渲染,按从远到近,如果后面的平面先渲染,它就能看见,如果后面的平面后渲染,它就看不见。那么相机只有部分角度能看见它正确的覆盖。

Logo

这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!

更多推荐