Unity Shader:透明度混合物体阴影处理技巧

更新:10-28 名人轶事 我要投稿 纠错 投诉

其实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 光影效果很难掌握,这篇文章或许能帮到我

    有11位网友表示赞同!

tina

终于有人来解释透明物体阴影了!这个现象我遇到好几次,都不知道怎么解决。

    有15位网友表示赞同!

哭花了素颜

透明度和阴影的混合是一个挺复杂的问题啊

    有14位网友表示赞同!

不相忘

这种知识点对于学习 Shader 非常关键吧

    有8位网友表示赞同!

有些人,只适合好奇~

要学着做一些效果视频展示一下这部分技术,感觉很有价值

    有9位网友表示赞同!

空谷幽兰

期待看到具体的 Shader 代码示例,这样更容易理解。

    有18位网友表示赞同!

ok绷遮不住我颓废的伤あ

透明物体阴影的实现方式有很多种,这篇文章会分享哪些方法呢?

    有16位网友表示赞同!

屌国女农

Unity 光影效果做的还是不错的,但确实还有进步空间

    有10位网友表示赞同!

半梦半醒i

这个话题很有深度,我迫切想要了解更多关于 Shader 的知识

    有8位网友表示赞同!

花菲

透明物体阴影是很多游戏开发中遇到的常见问题,这篇文章能解决我的疑惑吗?

    有16位网友表示赞同!

致命伤

学习 Unity Shader 一路磕磕绊绊的,这种详细的讲解真的很宝贵!

    有9位网友表示赞同!

为爱放弃

Unity 的 Shader 功能越来越强大,我已经迫不及待想要使用它来制作一些项目了。

    有9位网友表示赞同!

晨与橙与城

学习 Unity 也需要不断地尝试和探索,找到适合自己的方法。

    有20位网友表示赞同!

眷恋

这个标题听起来很有吸引力,我想详细了解透明物体阴影是如何处理的。

    有19位网友表示赞同!

苏樱凉

我平时也喜欢研究 Shader 的那些小技巧,希望这篇文章能给我带来一些启发。

    有20位网友表示赞同!

歆久

如果能让效果更加逼真,感觉就更好了!

    有15位网友表示赞同!

苏莫晨

学习 Unity 需要投入时间和精力,但最终成果却非常值得。

    有10位网友表示赞同!

采姑娘的小蘑菇

看了标题,我想到可以用透明物体阴影来制作一些特殊的视觉效果。

    有11位网友表示赞同!

汐颜兮梦ヘ

Unity 是一个强大的游戏引擎,期待能够掌握更多它的技巧和知识!

    有14位网友表示赞同!

【Unity Shader:透明度混合物体阴影处理技巧】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:精读小说佳作:短篇书评分享 下一篇:《四十七浪人》视效总监独家幕后揭秘!