Unity CG着色器常用内置代码宝典

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

float4 UnityObjectToClipPos(float4 v)

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

TRANSFORM_TEX(uv,tex)

应用纹理缩放和偏移。

fixed4 tex2D(tex,uv)

贴图采样。和贴图缩放偏移的参数顺序相反。

mul(unity_ObjectToWorld,v.vertex)

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

float3 UnityObjectToWorldNormal()

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

float4 _WorldSpaceLightPos0

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

WorldSpaceLightDir( float4 v.vertex)

返回顶点处的光照方向,没有归一化。

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" }

动态控制剔除:[Enum(UnityEngine.Rendering.CullMode)]_Cull("Cull",Float)=0 Cull [_Cull]

接收阴影:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值