読者です 読者をやめる 読者になる 読者になる

お米 is ライス

C#やらUnityやらを勉強していて、これはメモっといたほうがええやろ、ということを書くつもりです

UnityでポストエフェクトをGLSLで書く方法

ポストエフェクトとは

ゲーム空間内のオブジェクトを、Vertex ShaderやFragment Shaderを通してスクリーンに描画する画像を作るという処理の後、スクリーンに描画される画像に対してさらに様々な効果を加えることをいう(あってるんかな)。
例えば、画面をぼかしたり、モザイクにしたり、エッジの検出をしたり、ということである。
Unityでは、この処理を実装するために一連の流れを作る必要がある。

ポストエフェクトをCgで書く方法

以下のサイトがわかりやすくてよい
fspace.hatenablog.com

ポストエフェクトをGLSLで書く方法

Shaderにはいくつかの言語があり、Unityで主に使われているのはCgという言語だ。上で紹介した記事のShaderScriptもCgを用いている。
しかし、あえてGLSLで書きたい!!という場合、どのようにして書けばよいのだろうか?探してみたがGLSLでポストエフェクトを書いているサイトは見当たらなかったので、上記の記事をGLSLに簡単に翻訳した。
それが以下である(本当に基本的な事柄のみ書いてある)。

Shader "Custom/PostEffectTestShader" 
{
    Properties 
    {
        _MainTex("Source", 2D) = "" {}
    }

    SubShader 
    {
        ZTest Always
        Cull Off
        ZWrite Off
        Fog{ Mode Off }
        
        Pass
        {
            GLSLPROGRAM
            
            uniform sampler2D _MainTex;
            
            #ifdef VERTEX
            out vec4 coord;
            void main()
            {
                coord = gl_MultiTexCoord0;
                gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;   
            }
            #endif
            
            #ifdef FRAGMENT
            in vec4 coord;
            void main()
            {
                gl_FragColor = texture2D(_MainTex, vec2(coord));
            }
            #endif
            
            ENDGLSL
        }
    }
}

UnityでGLSLを使う方法そのものについては

GLSL Programming/Unity - Wikibooks, open books for an open world

を参照されたい。