7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GameBoy風のImageEffectシェーダコード

Last updated at Posted at 2020-04-16

twitterにアップしたGameBoy風に見えるようなImageEffectのシェーダコードを貼っておきます。

さて、昨日と今日にかけて4つの記事(3つ+α)を投稿しました。

ここで全部の集大成としてGameBoy風の見た目になるようなImageEffect用シェーダを作ります。

正直に3つ(モザイク、モノクロ(スクリーン合成)、Posterization)のImageEffectをかけても良いのですが、
3回もGraphic.Blit()を行うのは処理がもったいないので、計算部分を一つにまとめたOldMobileGame.shaderを用意しました。

OldMobileGame.shader
Shader "ScreenPocket/ImageEffect/OldMobileGame"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _UvDivideNum ( "UV Divide Num", Float ) = 128
        _ColorDivideNum ( "Color Divide Num", Float ) = 4
        _Color ("Main Color", Color ) = (0.025,0.35,0,1)
    }
    
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            float _UvDivideNum;
            float _ColorDivideNum;
            fixed4 _Color;

            fixed4 frag (v2f i) : SV_Target
            {
                //モザイク状にサンプリングする
                float2 uv = floor(i.uv * _UvDivideNum) / _UvDivideNum;
                half4 col = tex2D( _MainTex, uv );
                //モノクロ化
                col.rgb = Luminance(col.rgb);
                //ポスタリゼーションで色数を刻ませる
                col.rgb = floor(col.rgb * _ColorDivideNum) / _ColorDivideNum;
                //スクリーン合成で色を乗せる
                col.rgb = 1 - (1 - col.rgb) * (1 - _Color.rgb);
                return col;
            }
            ENDCG
        }
    }
}

スクリーンショット 2020-04-15 21.30.10.png
それっぽい感じが出せたかな?
そのまま使うのも良いですが、元の色(tex2D( _MainTex, i.uv ))をキープしておいてシームレスに切り替えてみるとか、
ドット絵が急にリアルになるような世界観の切り替わり演出にも応用できそうですね。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?