Unity中的透明效果之开启深度写入半透明效果

简介: 在Unity中实现开启深度写入的半透明效果,通过分离渲染过程为两个阶段:深度写入和颜色混合。首先,在深度写入阶段仅写入深度信息而不渲染颜色;其次,在颜色混合阶段进行正常的半透明颜色混合,确保后续物体能正确渲染且避免被错误裁剪。该方法解决了常规半透明渲染中关闭深度写入导致的问题。提供自定义Shader代码及材质设置步骤,方便开发者实现这一特殊渲染需求。

在 Unity 中实现开启深度写入的半透明效果是一种特殊的渲染需求
下面详细介绍其原理及相关实现要点。
在常规的半透明渲染中,为了实现正确的混合效果,通常会关闭深度写入(ZWrite Off)。这是因为半透明物体需要按照从后往前的顺序进行渲染,以确保前面的半透明物体能够正确地与后面的物体进行颜色混合。如果开启深度写入,半透明物体在渲染时会将自身的深度值写入深度缓冲区,后续的物体在进行深度测试时,可能会因为前面半透明物体的深度值而被裁剪掉,从而导致渲染结果错误。
开启深度写入的半透明效果原理

  1. 分离渲染过程
    开启深度写入的半透明效果的核心思想是将渲染过程分离为两个阶段:深度写入阶段和颜色混合阶段。
    深度写入阶段:在这个阶段,只进行深度写入操作,不进行颜色渲染。通过一个特殊的渲染通道,将半透明物体的深度信息写入深度缓冲区,就好像这些物体是不透明的一样。这样,后续的物体在进行深度测试时,会考虑到半透明物体的深度,避免被错误裁剪。
    颜色混合阶段:在深度写入完成后,再进行正常的半透明颜色混合渲染。此时,深度缓冲区已经包含了半透明物体的深度信息,后续的物体可以根据这个深度信息进行正确的渲染,同时半透明物体也能与其他物体进行正确的颜色混合。

下面是shader代码,创建材质球,选择写的shader,即可实现半透明效果

代码如下:

Shader "Custom/Shadder" {
Properties{
    _Color("Color", Color) = (1,1,1,1)
    _MainTex("MainTex", 2D) = "white" {}
_AlphaScale("Alpha Scale", Range(0, 1)) = 1
}
SubShader{
    Tags{ "Queue" = "Transparent" "IngnoreProjector" = "True" "RenderType" = "Transparent" }
    LOD 200

    Pass{
        ZWrite On
        ColorMask 0
    }

    Pass{
        Tags{ "LightMode" = "ForwardBase" }

        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha

        CGPROGRAM

        #pragma vertex vert
        #pragma fragment frag

        #include "Lighting.cginc"

        fixed4 _Color;
        sampler2D _MainTex;
        float4 _MainTex_ST;
        fixed _AlphaScale;

        struct a2v {
            float4 vertex : POSITION;
            float4 normal : NORMAL;
            float4 texcoord : TEXCOORD0;
        };

        struct v2f {
            float4 position : SV_POSITION;
            float3 worldNormal : TEXCOORD0;
            float3 worldPos : TEXCOORD1;
            float2 uv : TEXCOORD2;
        };

        v2f vert(a2v v)
        {
            v2f f;
            f.position = UnityObjectToClipPos(v.vertex);

            //计算世界空间下的法线
            f.worldNormal = UnityObjectToWorldNormal(v.normal);

            //计算世界空间下的顶点
            f.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

            //计算变换后的纹理坐标
            f.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

            return f;
        }

        fixed4 frag(v2f i) : SV_Target
        {
            //归一
            fixed3 worldNormal = normalize(i.worldNormal);
            fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

            //纹理颜色
            fixed4 textColor = tex2D(_MainTex, i.uv);


            //反射颜色
            fixed3 albedo = textColor.rgb * _Color.rgb;

            //环境光
            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

            //漫反射
            fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));

            return fixed4(ambient + diffuse, textColor.a * _AlphaScale);
        }

        ENDCG
    }
}
FallBack "Diffuse" 

}

最后自行测试即可

相关文章
|
图形学 Android开发 iOS开发
|
C# 图形学 开发者
【Unity3D实例-功能-镜头】第三人称视觉
本文介绍了Unity中常用的第三人称视角实现方法,适用于角色扮演游戏。内容包括安装Cinemachine插件、为角色添加面朝向点、创建虚拟摄像机、编写控制脚本及测试运行,帮助开发者快速掌握镜头控制技巧。
665 0
|
机器学习/深度学习 搜索推荐 算法
多任务学习之mmoe理论详解与实践
多任务学习之mmoe理论详解与实践
多任务学习之mmoe理论详解与实践
|
人工智能 语音技术 Docker
揭秘8.3k star 开源神器 VoiceCraft 用AI革新有声内容创作,只需几秒录音
VoiceCraft 是一款开源语音编辑与文本转语音(TTS)工具,仅需几秒录音即可实现语音克隆、插入、删除、替换等操作,支持零样本编辑和高自然度语音生成。适用于播客、短视频、有声书等内容创作场景,具备本地部署能力,已在 GitHub 获得 8.3k 星标。
1415 4
|
8月前
|
人工智能 开发框架 IDE
AI 时代的量化革命:10分钟开发你的第一个交易策略
本文手把手教你用AI工具10分钟开发首个量化交易策略:从克隆SDK、启动AI IDE,到生成KDJ_RSI组合策略、配置运行环境并实盘验证。零基础也能快速上手,开启AI驱动的量化投资新范式!
1383 17
|
存储 C# 图形学
Unity 逐字显示 打字机效果
在 Unity 中实现逐字显示的打字机效果,主要通过 UGUI Text 组件和 C# 脚本完成。核心原理是将文本逐字拆分并按时间间隔依次显示。具体步骤如下:1. 创建 Text 组件和脚本;2. 使用协程或 Update 方法控制字符逐个显示。代码示例展示了两种实现方式,一种使用协程 `IEnumerator`,另一种通过 `Update` 方法结合 `Substring` 实现逐字显示效果。
|
10月前
|
编解码 图形学 Android开发
《Unity渲染实战宝典:突破平台限制的优化策略》
本文聚焦Unity渲染的核心优化逻辑,深入解构渲染管线、材质系统、光照阴影、后处理、纹理资源及管线适配六大关键环节。针对开发者易陷入的参数堆砌误区,结合不同平台硬件特性,提出“分层适配”“视觉欺骗”“精准裁剪”等实战策略—如动态平衡实时光源与烘焙光照、精简Shader冗余变体、分级配置后处理效果、优化纹理分辨率与压缩格式。
801 7
|
缓存 API 开发工具
有关Unity使用Rider编辑器无法弹出代码提示的有效解决方法
【11月更文挑战第13天】在 Unity 中使用 Rider 编辑器时,若遇到代码提示无法弹出的问题,可以通过检查 Rider 设置(如自动补全选项、Unity 插件安装、索引设置)、Unity 项目设置(如解决方案正确关联、脚本导入设置)以及环境和依赖关系(如 .NET SDK 版本兼容性、Unity 和 Rider 版本兼容性)等方面进行排查和解决。
2770 5
|
数据可视化 图形学 开发者
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(上)
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例
6298 61
深入理解Debug断点调试技巧
深入理解Debug断点调试技巧
2127 1