Замена цвета

Шейдеры и все-все-все.

Замена цвета

Сообщение Vogd 18 фев 2019, 14:21

Только начинаю разбираться, помогите пожалуйста с простейшими понятиями.

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

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

Сообщение Paul Siberdt 18 фев 2019, 14:43

Шейдер на 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"
}
 
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

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

Сообщение seaman 18 фев 2019, 19:28

Преобразовать в HSV и менять Hue
https://github.com/greggman/hsva-unity
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение Vogd 19 фев 2019, 10:54

Paul Siberdt
У меня не заработал ShaderForge в последней юнити, что-то там у них недопилено.
Можете объяснить какие преобразования приводят к нужному результату?

seaman
hue я могу, но это сдвиг, я не понимаю как заменить на конкретный цвет, заданный через rgb
Vogd
UNIт
 
Сообщения: 55
Зарегистрирован: 04 май 2016, 15:46

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

Сообщение waruiyume 19 фев 2019, 11:29

Сделайте градиент из чёрного в белый, и скармливайте его и ещё 2 цвета в функцию "lerp".
Остаётся только менять один из цветов на нужный в данный момент.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение Vogd 20 фев 2019, 18:02

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 я не нашел(
Vogd
UNIт
 
Сообщения: 55
Зарегистрирован: 04 май 2016, 15:46

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

Сообщение seaman 20 фев 2019, 21:18

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

Вы совсем не открываете ссылки, которые Вам присылают?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

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

Сообщение Vogd 20 фев 2019, 23:27

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


Vogd писал(а):
seaman
hue я могу, но это сдвиг, я не понимаю как заменить на конкретный цвет, заданный через rgb
Vogd
UNIт
 
Сообщения: 55
Зарегистрирован: 04 май 2016, 15:46

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

Сообщение Woolf 20 фев 2019, 23:34

собранный в ShaderForge. Редактор стал бесплатным, советую поставить и поразбираться.

Поддержка SF уже, к сожалению, прекращена, редактор сдулся, посему, если как бесплатный, то ладно, а если осваивать как инструмент, то сейчас модно AmplyfyShaderEditor или ASE. И я вам таки скажу, инструмет мощный и приятный, и постоянно совершенствуется. Думаю, юнитехи его выкупят со временем и сделают в виде интегрированного инструмента.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

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

Сообщение seaman 21 фев 2019, 22:48

Как это сделать в шейдере?

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

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

У них есть свой
https://blogs.unity3d.com/ru/2018/02/27 ... al-editor/
Вроде приличный. Зачем им что-то выкупать?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3