Страница 1 из 1

Замена цвета

СообщениеДобавлено: 18 фев 2019, 14:21
Vogd
Только начинаю разбираться, помогите пожалуйста с простейшими понятиями.

Задача:
Есть текстура, градиент из белого цвета в синий.
Мне нужно поменять цвет с синего на заданный через шейдер. Т.е. чтобы белый остался белым, а все оттенки синего заменились на оттенки нужного цвета.
Я не понимаю сути преобразования, которое должно происходить.
Как мне кажется, я должен вычислить параметр который означает "интенсивность синего", и в итоговый цвет писать... что? Как цвет точки преобразовать нужным образом?

Re: Замена цвета

СообщениеДобавлено: 18 фев 2019, 14:43
Paul Siberdt
Шейдер на 4 колормаски, собранный в ShaderForge. Редактор стал бесплатным, советую поставить и поразбираться.

Скрытый текст:
Синтаксис:
Используется glsl
// Shader created with Shader Forge v1.38
// Shader Forge (c) Neat Corporation / Joachim Holmer - http://www.acegikmo.com/shaderforge/
// Note: Manually altering this data may prevent you from opening it in Shader Forge
/*SF_DATA;ver:1.38;sub:START;pass:START;ps:flbk:,iptp:0,cusa:False,bamd:0,cgin:,lico:0,lgpr:1,limd:2,spmd:1,trmd:0,grmd:0,uamb:True,mssp:True,bkdf:False,hqlp:False,rprd:False,enco:True,rmgx:True,imps:False,rpth:0,vtps:0,hqsc:True,nrmq:1,nrsp:0,vomd:0,spxs:False,tesm:0,olmd:1,culm:0,bsrc:0,bdst:1,dpts:2,wrdp:True,dith:0,atcv:False,rfrpo:True,rfrpn:Refraction,coma:15,ufog:True,aust:True,igpj:False,qofs:0,qpre:1,rntp:1,fgom:False,fgoc:False,fgod:False,fgor:False,fgmd:0,fgcr:0.5,fgcg:0.5,fgcb:0.5,fgca:1,fgde:0.01,fgrn:0,fgrf:300,stcl:False,atwp:False,stva:128,stmr:255,stmw:255,stcp:6,stps:0,stfa:0,stfz:0,ofsf:0,ofsu:0,f2p0:False,fnsp:False,fnfb:False,fsmp:False;n:type:ShaderForge.SFN_Final,id:4013,x:33209,y:32655,varname:node_4013,prsc:2|diff-7812-OUT,emission-3945-OUT,lwrap-6856-RGB;n:type:ShaderForge.SFN_NormalVector,id:1183,x:32036,y:32814,prsc:2,pt:True;n:type:ShaderForge.SFN_Dot,id:6226,x:32238,y:32748,varname:node_6226,prsc:2,dt:0|A-9055-OUT,B-1183-OUT;n:type:ShaderForge.SFN_ViewVector,id:9055,x:32036,y:32688,varname:node_9055,prsc:2;n:type:ShaderForge.SFN_OneMinus,id:3702,x:32404,y:32748,varname:node_3702,prsc:2|IN-6226-OUT;n:type:ShaderForge.SFN_Multiply,id:3571,x:32652,y:32670,varname:node_3571,prsc:2|A-6476-RGB,B-3702-OUT;n:type:ShaderForge.SFN_Color,id:6476,x:32036,y:32527,ptovrint:False,ptlb:Rim Ccolor,ptin:_RimCcolor,varname:node_6476,prsc:2,glob:False,taghide:False,taghdr:False,tagprd:False,tagnsco:False,tagnrm:False,c1:0.8382353,c2:0.8028696,c3:0.5177335,c4:1;n:type:ShaderForge.SFN_Add,id:3945,x:32915,y:32772,varname:node_3945,prsc:2|A-3571-OUT,B-433-RGB;n:type:ShaderForge.SFN_Color,id:433,x:32036,y:33006,ptovrint:False,ptlb:Fill Color,ptin:_FillColor,varname:node_433,prsc:2,glob:False,taghide:False,taghdr:False,tagprd:False,tagnsco:False,tagnrm:False,c1:0.04779412,c2:0.3823529,c3:0.1746957,c4:1;n:type:ShaderForge.SFN_Color,id:6856,x:32036,y:33187,ptovrint:False,ptlb:Light Wrapping,ptin:_LightWrapping,varname:node_6856,prsc:2,glob:False,taghide:False,taghdr:False,tagprd:False,tagnsco:False,tagnrm:False,c1:0.08088237,c2:0.08088237,c3:0.08088237,c4:1;n:type:ShaderForge.SFN_Tex2d,id:6610,x:31853,y:32368,ptovrint:False,ptlb:ColorMap,ptin:_ColorMap,varname:node_1725,prsc:2,glob:False,taghide:False,taghdr:False,tagprd:False,tagnsco:False,tagnrm:False,tex:da3507359d47f654c892d282db2028a2,ntxv:0,isnm:False;n:type:ShaderForge.SFN_Color,id:8714,x:31674,y:31931,ptovrint:False,ptlb:ColorForGreen,ptin:_ColorForGreen,varname:node_8403,prsc:2,glob:False,taghide:False,taghdr:False,tagprd:False,tagnsco:False,tagnrm:False,c1:0,c2:1,c3:0,c4:1;n:type:ShaderForge.SFN_Multiply,id:6088,x:32141,y:31876,varname:node_6088,prsc:2|A-8862-RGB,B-6610-R;n:type:ShaderForge.SFN_Color,id:8862,x:31674,y:31769,ptovrint:False,ptlb:ColorForRed,ptin:_ColorForRed,varname:node_4521,prsc:2,glob:False,taghide:False,taghdr:False,tagprd:False,tagnsco:False,tagnrm:False,c1:1,c2:0,c3:0,c4:1;n:type:ShaderForge.SFN_Multiply,id:7411,x:32141,y:32008,varname:node_7411,prsc:2|A-8714-RGB,B-6610-G;n:type:ShaderForge.SFN_Add,id:7812,x:32437,y:32076,varname:node_7812,prsc:2|A-6088-OUT,B-7411-OUT,C-7630-OUT,D-6813-OUT;n:type:ShaderForge.SFN_Color,id:3518,x:31674,y:32098,ptovrint:False,ptlb:ColorForBlue,ptin:_ColorForBlue,varname:_ColorForGreen_copy,prsc:2,glob:False,taghide:False,taghdr:False,tagprd:False,tagnsco:False,tagnrm:False,c1:0,c2:0,c3:1,c4:1;n:type:ShaderForge.SFN_Multiply,id:7630,x:32141,y:32149,varname:node_7630,prsc:2|A-3518-RGB,B-6610-B;n:type:ShaderForge.SFN_Color,id:3481,x:31674,y:32267,ptovrint:False,ptlb:ColorForAlpha,ptin:_ColorForAlpha,varname:_ColorForBlue_copy,prsc:2,glob:False,taghide:False,taghdr:False,tagprd:False,tagnsco:False,tagnrm:False,c1:0.4852941,c2:0.4852941,c3:0.4852941,c4:1;n:type:ShaderForge.SFN_Multiply,id:6813,x:32141,y:32284,varname:node_6813,prsc:2|A-3481-RGB,B-6610-A;proporder:6476-433-6856-6610-8862-8714-3518-3481;pass:END;sub:END;*/

Shader "Shader Forge/Rim 4Color Mask" {
    Properties {
        _RimCcolor ("Rim Ccolor", Color) = (0.8382353,0.8028696,0.5177335,1)
        _FillColor ("Fill Color", Color) = (0.04779412,0.3823529,0.1746957,1)
        _LightWrapping ("Light Wrapping", Color) = (0.08088237,0.08088237,0.08088237,1)
        _ColorMap ("ColorMap", 2D) = "white" {}
        _ColorForRed ("ColorForRed", Color) = (1,0,0,1)
        _ColorForGreen ("ColorForGreen", Color) = (0,1,0,1)
        _ColorForBlue ("ColorForBlue", Color) = (0,0,1,1)
        _ColorForAlpha ("ColorForAlpha", Color) = (0.4852941,0.4852941,0.4852941,1)
    }
    SubShader {
        Tags {
            "RenderType"="Opaque"
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
           
           
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #define UNITY_PASS_FORWARDBASE
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma multi_compile_fog
            #pragma only_renderers d3d9 d3d11 glcore gles
            #pragma target 3.0
            uniform float4 _LightColor0;
            uniform float4 _RimCcolor;
            uniform float4 _FillColor;
            uniform float4 _LightWrapping;
            uniform sampler2D _ColorMap; uniform float4 _ColorMap_ST;
            uniform float4 _ColorForGreen;
            uniform float4 _ColorForRed;
            uniform float4 _ColorForBlue;
            uniform float4 _ColorForAlpha;
            struct VertexInput {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float2 texcoord0 : TEXCOORD0;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 posWorld : TEXCOORD1;
                float3 normalDir : TEXCOORD2;
                LIGHTING_COORDS(3,4)
                UNITY_FOG_COORDS(5)
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = v.texcoord0;
                o.normalDir = UnityObjectToWorldNormal(v.normal);
                o.posWorld = mul(unity_ObjectToWorld, v.vertex);
                float3 lightColor = _LightColor0.rgb;
                o.pos = UnityObjectToClipPos( v.vertex );
                UNITY_TRANSFER_FOG(o,o.pos);
                TRANSFER_VERTEX_TO_FRAGMENT(o)
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                i.normalDir = normalize(i.normalDir);
                float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
                float3 normalDirection = i.normalDir;
                float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
                float3 lightColor = _LightColor0.rgb;
////// Lighting:
                float attenuation = LIGHT_ATTENUATION(i);
                float3 attenColor = attenuation * _LightColor0.xyz;
                float Pi = 3.141592654;
                float InvPi = 0.31830988618;
/////// Diffuse:
                float NdotL = dot( normalDirection, lightDirection );
                float3 w = _LightWrapping.rgb*0.5; // Light wrapping
                float3 NdotLWrap = NdotL * ( 1.0 - w );
                float3 forwardLight = max(float3(0.0,0.0,0.0), NdotLWrap + w );
                NdotL = max(0.0,dot( normalDirection, lightDirection ));
                float3 directDiffuse = forwardLight*(0.5-max(w.r,max(w.g,w.b))*0.5) * attenColor;
                float3 indirectDiffuse = float3(0,0,0);
                indirectDiffuse += UNITY_LIGHTMODEL_AMBIENT.rgb; // Ambient Light
                float4 _ColorMap_var = tex2D(_ColorMap,TRANSFORM_TEX(i.uv0, _ColorMap));
                float3 diffuseColor = ((_ColorForRed.rgb*_ColorMap_var.r)+(_ColorForGreen.rgb*_ColorMap_var.g)+(_ColorForBlue.rgb*_ColorMap_var.b)+(_ColorForAlpha.rgb*_ColorMap_var.a));
                float3 diffuse = (directDiffuse + indirectDiffuse) * diffuseColor;
////// Emissive:
                float3 emissive = ((_RimCcolor.rgb*(1.0 - dot(viewDirection,normalDirection)))+_FillColor.rgb);
/// Final Color:
                float3 finalColor = diffuse + emissive;
                fixed4 finalRGBA = fixed4(finalColor,1);
                UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
                return finalRGBA;
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
    CustomEditor "ShaderForgeMaterialInspector"
}
 

Re: Замена цвета

СообщениеДобавлено: 18 фев 2019, 19:28
seaman
Преобразовать в HSV и менять Hue
https://github.com/greggman/hsva-unity

Re: Замена цвета

СообщениеДобавлено: 19 фев 2019, 10:54
Vogd
Paul Siberdt
У меня не заработал ShaderForge в последней юнити, что-то там у них недопилено.
Можете объяснить какие преобразования приводят к нужному результату?

seaman
hue я могу, но это сдвиг, я не понимаю как заменить на конкретный цвет, заданный через rgb

Re: Замена цвета

СообщениеДобавлено: 19 фев 2019, 11:29
waruiyume
Сделайте градиент из чёрного в белый, и скармливайте его и ещё 2 цвета в функцию "lerp".
Остаётся только менять один из цветов на нужный в данный момент.

Re: Замена цвета

СообщениеДобавлено: 20 фев 2019, 18:02
Vogd
waruiyume
Я попробовал - если использовать только lerp, то получается смешение между цветом и вторым цветом, вобщем что-то вроде фотошоповского Lighten.

Мне нужен эффект как от фотошоповского Color.
Вот описание действия:

"Keeps the color of the active layer, and blends the hue and saturation (the color) of the active layer with the luminance of the lower layers (a handy way to change the color of an image)."

"С помощью этого параметра создается результирующий цвет со светимостью основного цвета и с цветовым тоном и насыщенностью совмещенного цвета. Этот параметр сохраняет уровни серого в изображении и может применяться для раскрашивания монохромных изображений и добавления оттенков к цветным изображениям."

Насколько я понял, в фотошопе RGB переводится в HSY (Hue, Saturation, Luminosity), потом смещается Hue до нужного места и переводится обратно.
Как это сделать в шейдере?

Похожего результата можно добиться через смешение по Overlay формуле, но она выжигает изображение.
Формулы для смешения Color я не нашел(

Re: Замена цвета

СообщениеДобавлено: 20 фев 2019, 21:18
seaman
Насколько я понял, в фотошопе RGB переводится в HSY (Hue, Saturation, Luminosity), потом смещается Hue до нужного места и переводится обратно.
Как это сделать в шейдере?

Вы совсем не открываете ссылки, которые Вам присылают?

Re: Замена цвета

СообщениеДобавлено: 20 фев 2019, 23:27
Vogd
seaman писал(а):
Вы совсем не открываете ссылки, которые Вам присылают?


Vogd писал(а):
seaman
hue я могу, но это сдвиг, я не понимаю как заменить на конкретный цвет, заданный через rgb

Re: Замена цвета

СообщениеДобавлено: 20 фев 2019, 23:34
Woolf
собранный в ShaderForge. Редактор стал бесплатным, советую поставить и поразбираться.

Поддержка SF уже, к сожалению, прекращена, редактор сдулся, посему, если как бесплатный, то ладно, а если осваивать как инструмент, то сейчас модно AmplyfyShaderEditor или ASE. И я вам таки скажу, инструмет мощный и приятный, и постоянно совершенствуется. Думаю, юнитехи его выкупят со временем и сделают в виде интегрированного инструмента.

Re: Замена цвета

СообщениеДобавлено: 21 фев 2019, 22:48
seaman
Как это сделать в шейдере?

Там в шейдере это сделано.
я не понимаю как заменить на конкретный цвет, заданный через rgb

Разберетесь как работает шейдер из ссылки - думаю сможете это. Я не спец в шейдерах, мне это не нужно - разбираться. Но если у них работает, значит можно.
юнитехи его выкупят со временем и сделают в виде интегрированного инструмента

У них есть свой
https://blogs.unity3d.com/ru/2018/02/27 ... al-editor/
Вроде приличный. Зачем им что-то выкупать?