Unity CG着色器常用内置代码宝典
这里不废话,直接把着色器最常用的内置代码列出,以便快速查阅。
这里不废话,直接把着色器最常用的内置代码列出,以便快速查阅。
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
我们可以推理一下,它和不透明一起渲染,按从远到近,如果后面的平面先渲染,它就能看见,如果后面的平面后渲染,它就看不见。那么相机只有部分角度能看见它正确的覆盖。
这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!
更多推荐
所有评论(0)