You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Shader问题:白色像素无法设置为透明

问题解决:Shader中白色像素无法设为透明

你的代码逻辑没问题,但缺少透明渲染的关键配置,导致Alpha值修改后不生效,具体问题和修复方案如下:

核心问题

  1. 未开启Alpha混合模式:虽然设置了"Queue" = "Transparent"队列,但GPU需要明确的混合指令才会处理透明像素,否则会直接忽略Alpha值,用不透明方式绘制。
  2. Fallback冲突:你用了FallBack "Diffuse",而Diffuse是不透明Shader,会覆盖你的透明设置。

修复步骤

1. 在Pass中添加混合指令

在Pass的CGPROGRAM之前添加:

Blend SrcAlpha OneMinusSrcAlpha

这是Unity标准的透明混合公式,会根据像素Alpha值混合背景。

2. 移除或替换Fallback

把FallBack "Diffuse"删掉,或者替换为支持透明的Shader,比如:

FallBack "Transparent/VertexLit"

3. 可选:检查纹理导入设置

如果你的纹理本身带Alpha通道,确保在Unity的纹理导入面板中勾选了Alpha is Transparency,不过你这里是手动设置Alpha为0,这一步不是必须,但可以避免后续问题。

修改后的完整Shader代码

Shader "ARBI/WhiteToTransparent"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }

    SubShader
    {
        Tags { "Queue" = "Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
        LOD 200

        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha // 新增混合指令
            CGPROGRAM

            #pragma vertex vertexFunction
            #pragma fragment fragmentFunction
            #include "UnityCG.cginc"

            float4 _Color;
            sampler2D _MainTex;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 position : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vertexFunction(appdata IN)
            {
                v2f OUT;

                OUT.position = UnityObjectToClipPos(IN.vertex);
                OUT.uv = IN.uv;

                return OUT;
            }

            fixed4 fragmentFunction(v2f IN) : SV_TARGET
            {
                fixed4 pixelColor = tex2D(_MainTex, IN.uv);

                // 检测近似白色的像素
                if (pixelColor.r > 0.99 && pixelColor.g > 0.99 && pixelColor.b > 0.99)
                {
                    pixelColor.a = 0; // 设置为透明
                }

                return pixelColor;
            }

            ENDCG
        }
    }
    // FallBack "Transparent/VertexLit" // 可选保留,或者直接删除
}

另外,还可以优化白色检测的逻辑,用all(pixelColor.rgb > 0.99)代替三个条件,代码更简洁:

if (all(pixelColor.rgb > 0.99))
{
    pixelColor.a = 0;
}

内容的提问来源于stack exchange,提问作者CocoaMilka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:55:11