簡體   English   中英

Unity Shader RGBA 顏色遮罩

[英]Unity Shader RGBA Color mask

我正在為 Unity 開發一個着色器,我想在其中根據蒙版圖像更改顏色。 在此蒙版圖像中,RGB 通道代表可以在着色器中選擇的顏色。 着色器背后的想法是,無需手動更改紋理即可輕松更改對象的外觀。

Shader "Custom/MultiColor" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _MaskTex ("Mask area (RGB)", 2D) = "black" {}
        _ColorR ("Red Color", Color) = (1,1,1,1)
        _ColorG ("Green Color", Color) = (1,1,1,1)
        _ColorB ("Blue Color", Color) = (1,1,1,1)
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        sampler2D _MaskTex;
        half4 _ColorR;
        half4 _ColorG;
        half4 _ColorB;
        half4 _MaskMult;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 main = tex2D (_MainTex, IN.uv_MainTex);
            half4 mask = tex2D (_MaskTex, IN.uv_MainTex);

            half3 cr = main.rgb * _ColorR;
            half3 cg = main.rgb * _ColorG;
            half3 cb = main.rgb * _ColorB;

            half r = mask.r;
            half g = mask.g;
            half b = mask.b;

            half minv = min(r + g + b, 1);

            half3 cf = lerp(lerp(cr, cg, g*(r+g)), cb, b*(r+g+b));
            half3 c = lerp(main.rgb, cf, minv);

            o.Albedo = c.rgb;
            o.Alpha = main.a;
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

着色器的問題是基於綠色和藍色通道的蒙版顏色之間的混合。 在假定來自紅色區域的顏色中定義的顏色之間是可見的。 下面的樣本是可見的。在此處輸入圖像描述

紅色由紅色蒙版創建,綠色由綠色蒙版創建,沙漠黃色由藍色區域創建。 我不知道為什么會發生這種情況或如何解決這個問題。

最佳猜測:抗鋸齒圖像壓縮。 鋸齒(在您使用的畫筆上)將導致顏色通道重疊,導致它們混合。 壓縮通常通過根據每個像素周圍的顏色平均每個像素的顏色信息來工作(jpeg 在這方面尤其臭名昭著)。

通過在 Photoshop(或您正在使用的任何圖像套件)中使用基於直像素的畫筆(無鋸齒,無圓邊)和/或嘗試通過着色器更改顏色並查看它們如何混合 - 進行故障排除更好地了解引擎蓋下發生的事情。 這與無損/未壓縮的圖像類型相結合,例如 .tga 應該會有所幫助,盡管它們可能會使用更多內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM