SpriteStudio / SS5PlayerForUnity

OPTPiX SpriteStudio 5 Player for Unity
http://www.webtech.co.jp/spritestudio/
MIT License
39 stars 15 forks source link

v1.5.17/v1.6.0 テクスチャにレンダリングした時にパーツの継ぎ目が黒く出てしまう #211

Open MasamiYitsuse opened 6 years ago

MasamiYitsuse commented 6 years ago

SS5Player for Unity(以降SS5PU)で、RenderTextureにレンダリングした際に、元データのテクスチャがPre-Multipied Alpha(乗算済アルファ)である場合、パーツの継ぎ目のピクセルが暗く沈んで、継ぎ目が見えてしまう場合があります。

この場合、SS5PUのシェーダを修正することで回避することが可能です。

対象ファイル1: Assets/SpriteStudio/Shader/Base/ShaderPixel_Sprite_SpriteStudio

//
//  SpriteStudio5 Player for Unity
//
//  Copyright(C) Web Technology Corp.
//  All rights reserved.
//
#define LIMIT_ALPHA 0.0038
sampler2D   _MainTex;

#ifdef SV_Target
fixed4  PS_main(InputPS Input) : SV_Target
#else
fixed4  PS_main(InputPS Input) : COLOR0
#endif
{
    fixed4  Output;

    fixed4  Pixel = tex2D(_MainTex, Input.Texture00UV.xy);
    Pixel *= Input.ColorMain;

    fixed4  OverlayParameter = Input.ParameterOverlay;
    fixed4  ColorOverlay = Input.ColorOverlay;
    fixed   ColorAlpha = ColorOverlay.a;
    fixed   PixelAlpha = Pixel.a;

    fixed4  PixelCoefficientColorOvelay = ((0.0f > OverlayParameter.z) ? fixed4(1.0f, 1.0f, 1.0f, 1.0f) : (Pixel * OverlayParameter.z));
    ColorOverlay *= ColorAlpha;

    Pixel = ((Pixel * (1.0f - (ColorAlpha * OverlayParameter.y))) * OverlayParameter.x) + (PixelCoefficientColorOvelay * ColorOverlay * OverlayParameter.w);
    Pixel.xyz *= PixelAlpha; // ←この行を追加
    Pixel.a = PixelAlpha;
    Output = Pixel;

    return(Output);
}

対象ファイル2: Assets/SpriteStudio/Shader/Sprite_SpriteStudio_Mix

//
//  SpriteStudio5 Player for Unity
//
//  Copyright(C) Web Technology Corp.
//  All rights reserved.
//
Shader "Custom/SpriteStudio5/Mix" {
    Properties  {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _OverlayParameter_Non ("Parameter(Non)", Vector) = (1.0, 0.0, -1.0, 0.0)
        _OverlayParameter_Mix ("Parameter(Mix)", Vector) = (1.0, 1.0, -1.0, 1.0)
        _OverlayParameter_Add ("Parameter(Add)", Vector) = (1.0, 0.0, -1.0, 1.0)
        _OverlayParameter_Sub ("Parameter(Sub)", Vector) = (1.0, 0.0, -1.0, -1.0)
        _OverlayParameter_Mul ("Parameter(Mul)", Vector) = (1.0, 1.0, 1.0, 1.0)
    }

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

        Pass    {
            Lighting Off
            Fog { Mode off }

            Cull Off
            ZTest LEqual
            ZWRITE Off

            Blend One OneMinusSrcAlpha // ←元は「Blend SrcAlpha OneMinusSrcAlpha」

            CGPROGRAM
            #pragma vertex VS_main
            #pragma fragment PS_main

            #include "UnityCG.cginc"

            #include "Base/ShaderVertex_Sprite_SpriteStudio.cginc"

            #include "Base/ShaderPixel_Sprite_SpriteStudio.cginc"

            ENDCG

            SetTexture [_MainTex]   {
                Combine Texture, Texture
            }
        }
    }
    FallBack Off
}

この修正を行った上で、 Assets/SpriteStudio/Shader内の「SpriteSpriteStudio~」のシェーダを全て再コンパイルします。


ただし、元の素材のデータ群がPre-Multiplied AlphaとStraight Alpha(ストレートアルファ)が混在している場合、Straight Alphaのテクスチャを使ったデータの出力が(逆に)おかしくなる可能性があるので、その旨注意する必要があります。

プロジェクトの状況を考慮して、適用するかを選択してくださいますようお願い致します。