【Defold】modelコンポーネント用 カラー入れ替え シェーダー

2020/10/12Defold, DEVELOP

Defold 用の model コンポーネント用カラー入れ替えシェーダーです。RGB3つのチャンネルを表すテクスチャを用意してその色を入れ替えます。

普通に描画するターゲットのテクスチャ

チャンネル用のテクスチャ

RGBの部分の色を変更することが出来ます。

シェーダーコード

attribute highp vec4 position;
attribute mediump vec2 texcoord0;
attribute mediump vec3 normal;
 
uniform mediump mat4 mtx_worldview;
uniform mediump mat4 mtx_view;
uniform mediump mat4 mtx_proj;
uniform mediump mat4 mtx_normal;
uniform mediump vec4 light;
 
varying highp vec4 var_position;
varying mediump vec3 var_normal;
varying mediump vec2 var_texcoord0;
 
void main()
{
    vec4 p = mtx_worldview * vec4(position.xyz, 1.0);
    var_position = p;
    var_texcoord0 = texcoord0;
    var_normal = normalize((mtx_normal * vec4(normal, 0.0)).xyz);
    gl_Position = mtx_proj * p;
}
varying highp vec4 var_position;
varying mediump vec3 var_normal;
varying mediump vec2 var_texcoord0;
 
uniform lowp sampler2D tex0;
uniform lowp sampler2D tex1;
uniform lowp vec4 tint;
uniform lowp vec4 _ColorSwapRed;
uniform lowp vec4 _ColorSwapRedLuminosity;
uniform lowp vec4 _ColorSwapGreen;
uniform lowp vec4 _ColorSwapGreenLuminosity;
uniform lowp vec4 _ColorSwapBlue;
uniform lowp vec4 _ColorSwapBlueLuminosity;
 
float saturate(float f)
{
    return clamp(f, 0.0, 1.0);
}
 
void main()
{
    // Pre-multiply alpha since all runtime textures already are
    vec4 tint_pm = vec4(tint.xyz * tint.w, tint.w);
    vec4 col = texture2D(tex0, var_texcoord0.xy) * tint_pm;
 
    float luminance = 0.3 * col.x + 0.59 * col.y + 0.11 * col.z;
 
    vec4 swapMask = texture2D(tex1, var_texcoord0.xy);
    swapMask.xyz *= swapMask.w;
                 
    vec4 redSwap = _ColorSwapRed * swapMask.x * col.w * saturate(luminance + _ColorSwapRedLuminosity.w);
    vec4 greenSwap = _ColorSwapGreen * swapMask.y * col.w * saturate(luminance + _ColorSwapGreenLuminosity.w);
    vec4 blueSwap = _ColorSwapBlue * swapMask.z * col.w * saturate(luminance + _ColorSwapBlueLuminosity.w);
 
    col.xyz = col.xyz * saturate(1.0 - swapMask.x - swapMask.y - swapMask.z);
    col.xyz = col.xyz + redSwap.xyz + greenSwap.xyz + blueSwap.xyz;
 
    gl_FragColor = col;
}

マテリアルの設定はこちらです。

結果

オリジナル

適用後

お知らせ

スポンサーリンク

Posted by kazupon