其实Unity Shader:透明度混合物体阴影处理技巧的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享Unity Shader:透明度混合物体阴影处理技巧的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
当然,我们可以通过将半透明物体的Fallback设置为VertexLit、Diffuse等不透明物体所使用的Unity Shader来强制为半透明物体生成阴影,这样Unity就会在其Fallback中找到一个阴影投射Pass。
着色器代码:
//透明物体、阴影
着色器“Unlit/AlphaBlendWithShadow”
{
特性
{
_Color ("颜色色调", 颜色)=(1, 1, 1, 1)
_MainTex("Main Tex", 2D)="white" { }//主纹理
_AlphaScale("Alpha Scale", Range(0, 1))=1 //透明度
}
子着色器
{
标签{ "Queue"="透明" "IgnoreProjector"="True" "RenderType"="透明" }
经过
{
标签{ "LightMode"="ForwardBase" }
Z 注销
混合SrcAlpha OneMinusSrcAlpha
CG程序
//编译指令以确保在pass中获得正确的光照变量。
#pragma multi_compile_fwdbase
#pragma 顶点vert
#pragma 片段片段
#include "Lighting.cginc"
#include "AutoLight.cginc"
固定4_颜色;
采样器2D _MainTex;
//_MainTex_ST(声明方式:name_ST) :声明_MainTex是用于uv操作的采样图像。下面两个是等价的
//o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
//o.uv=v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
//如果没有声明,则无法执行TRANSFORM_TEX 的操作。 _MainTex_ST.xy是纹理图Tiling(缩放),zw是纹理中的偏移(offset)
//如果Tiling 和Offset 保持默认值,即Tiling 为(1, 1)、Offset 为(0, 0) 时,则不需要TRANSFORM_TEX 操作。
//即:o.uv=v.texcoord
固定4_MainTex_ST;
修复_AlphaScale;
//应用传递给顶点着色器的数据
结构a2v
{
float4 vertex: 位置; //语义:顶点坐标
float3 正常: 正常; //语义:正常
float4 texcoord: TEXCOORD0; //语义:第一组纹理的坐标
};
//顶点着色器传递给片段着色器的数据
结构体v2f
{
float4 pos: SV_POSITION; //语义:裁剪空间的顶点坐标
float3 worldNormal: TEXCOORD0;
float3 worldPos: TEXCOORD1;
float2 uv: TEXCOORD2;
SHADOW_COORDS(3) //声明一个用于采样阴影纹理的坐标(该宏参数需要是下一个可用插值寄存器的索引值,这里是3)
};
//顶点着色器
v2f 垂直(a2v v)
{
v2f o;
//将顶点坐标从模型空间变换到裁剪空间
//等价于o.pos=mul(UNITY_MATRIX_MVP, v.vertex);
o.pos=UnityObjectToClipPos(v.vertex);
//将法线从模型空间变换到世界空间
//等价于o.worldNormal=mul(v.normal, (float3x3)unity_WorldToObject);
o.worldNormal=UnityObjectToWorldNormal(v.normal);
//将顶点坐标从模型空间变换到世界空间
o.worldPos=mul(unity_ObjectToWorld, v.vertex).xyz;
//计算纹理坐标(缩放和平移)
//相当于o.uv=v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
o.uv=TRANSFORM_TEX(v.texcoord, _MainTex);
//计算声明的阴影纹理坐标
TRANSFER_SHADOW(o);
返回o;
}
//片段着色器
固定4碎片(v2f i): SV_TARGET
{
固定3 worldNormal=标准化(i.worldNormal);
//世界空间光矢量
fixed3 worldLightDir=标准化(UnityWorldSpaceLightDir(i.worldPos));
//对纹理进行采样
固定4 texColor=tex2D(_MainTex, i.uv);
固定3反照率=texColor.rgb * _Color.rgb;
//环境光
固定3环境=UNITY_LIGHTMODEL_AMBIENT.xyz *反照率;
//漫反射
固定3漫反射=_LightColor0.rgb * 反照率* max(0, dot(worldNormal, worldLightDir));
//计算阴影和光线衰减
UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
返回fixed4(环境+漫反射* atten,texColor.a * _AlphaScale);
}
ENDCG
}
}
FallBack“透明/顶点光照”
//或者强制投射阴影
【Unity Shader:透明度混合物体阴影处理技巧】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直觉得 UNITY 光影效果很难掌握,这篇文章或许能帮到我
有11位网友表示赞同!
终于有人来解释透明物体阴影了!这个现象我遇到好几次,都不知道怎么解决。
有15位网友表示赞同!
透明度和阴影的混合是一个挺复杂的问题啊
有14位网友表示赞同!
这种知识点对于学习 Shader 非常关键吧
有8位网友表示赞同!
要学着做一些效果视频展示一下这部分技术,感觉很有价值
有9位网友表示赞同!
期待看到具体的 Shader 代码示例,这样更容易理解。
有18位网友表示赞同!
透明物体阴影的实现方式有很多种,这篇文章会分享哪些方法呢?
有16位网友表示赞同!
Unity 光影效果做的还是不错的,但确实还有进步空间
有10位网友表示赞同!
这个话题很有深度,我迫切想要了解更多关于 Shader 的知识
有8位网友表示赞同!
透明物体阴影是很多游戏开发中遇到的常见问题,这篇文章能解决我的疑惑吗?
有16位网友表示赞同!
学习 Unity Shader 一路磕磕绊绊的,这种详细的讲解真的很宝贵!
有9位网友表示赞同!
Unity 的 Shader 功能越来越强大,我已经迫不及待想要使用它来制作一些项目了。
有9位网友表示赞同!
学习 Unity 也需要不断地尝试和探索,找到适合自己的方法。
有20位网友表示赞同!
这个标题听起来很有吸引力,我想详细了解透明物体阴影是如何处理的。
有19位网友表示赞同!
我平时也喜欢研究 Shader 的那些小技巧,希望这篇文章能给我带来一些启发。
有20位网友表示赞同!
如果能让效果更加逼真,感觉就更好了!
有15位网友表示赞同!
学习 Unity 需要投入时间和精力,但最终成果却非常值得。
有10位网友表示赞同!
看了标题,我想到可以用透明物体阴影来制作一些特殊的视觉效果。
有11位网友表示赞同!
Unity 是一个强大的游戏引擎,期待能够掌握更多它的技巧和知识!
有14位网友表示赞同!