Mugichoko's blog

Mugichoko’s blog

しがない研究者のプログラミングを中心としたメモ書き.

Unity + Cg/HLSLでテクスチャマッピング

モチベーションと目標

前回に書いた通り,GLSLは諦めてCg/HLSLに移行することにしました.今回の目標は『以前にGLSLで実装した内容をCg/HLSL用に書き換える』です.

http://mugichoko.hatenablog.com/entry/2019/02/12/091328mugichoko.hatenablog.com

C#スクリプト

ここで書いたC#スクリプトと同じなので再利用できます.

Cg/HLSLコード

ほぼGLSLのコードと同じです.ちなみに,『Alan ZucconiさんのVertex and fragment shaders in Unity3D』のサイトを参考にして書き換えていきました.

GLSL版との主な相違点は以下の通りです.

  • 9~10行目 #pragmaで対象となるShaderの種類を明記して,関数名を決めておく
  • 12~22行目 Vertex ShaderとFragment Shaderに入出力するデータの形式をあらかじめ明記しておく

得られる結果は同じなので,省略します.

Shader "Custom/TextureMappingShader"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            struct vsIn
            {
                float4 position : POSITION;
                float4 texCoord : TEXCOORD0;
            };

            struct fsIn
            {
                float4 position : SV_POSITION;
                float4 texCoord : TEXCOORD0;
            };

            fsIn vert(vsIn input)
            {
                fsIn o;
                o.texCoord = input.texCoord;
                o.position = UnityObjectToClipPos(input.position);
                return o;
            }

            uniform sampler2D texSampler;

            half4 frag(fsIn input) : COLOR
            {
                return tex2D(texSampler, input.texCoord.xy);
            }

            ENDCG
        }
    }
}

追記

以下のように,Passを後ろに回す書き方もありとのこと.

Shader "Custom/TextureMappingShader"
{
    SubShader
    {
        CGINCLUDE

        struct vsIn
        {
            float4 position : POSITION;
            float4 texCoord : TEXCOORD0;
        };

        struct fsIn
        {
            float4 position : SV_POSITION;
            float4 texCoord : TEXCOORD0;
        };

        fsIn vert(vsIn input)
        {
            fsIn o;
            o.texCoord = input.texCoord;
            o.position = UnityObjectToClipPos(input.position);
            return o;
        }

        uniform sampler2D texSampler;

        half4 frag(fsIn input) : COLOR
        {
            return tex2D(texSampler, input.texCoord.xy);
        }

        ENDCG
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            ENDCG
        }
    }
}