[グラフィック]グラフィック学習(4)


ここではテクスチャに関する実習を行います.

1.基本テクスチャI/O構造


入出力テクスチャの基本構造

学識

    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
  • 上のコードでは、「白」は、テクスチャが指定されていない場合に白のテクスチャをベースにしたり、階調や黒などを指定したりすることができることを示しています.
        sampler2D _MainTex;
  • テクスチャは、UVに遭遇する前にメモリ内のテクスチャだけであり、float 4ではなくsampler 2 d(
  • )
        struct Input
        {
           float2 uv_MainTex;
        };
  • UVはvertexが所有しており、エンジンから取得できるため、Input構造で
  • と宣言する必要があります.
  • Input構造に任意の変数
  • を作成できません.
  • uv MainTexはMainTexのuv、uvはu、vの2つの数字からなるflaot 2
  •     fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
  • tex 2 D関数は、1番目のパラメータをサンプルとし、2番目のパラメータはUV、すなわち
  • である.
  • INは入力構造体
  • である.

    コード全体

    Shader "Custom/Tex"
    {
        Properties
        {
            _MainTex ("Albedo (RGB)", 2D) = "white" {}
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
    
            CGPROGRAM
            #pragma surface surf Standard fullforwardshadows
    
            sampler2D _MainTex;
    
            struct Input
            {
                float2 uv_MainTex;
            };
    
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
                fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
                o.Albedo = c.rgb;
                o.Alpha = c.a;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }
    


    2.画像を白黒にする


    surf関数の部分を変えるだけで

    学識


    白黒画像の特徴は、R、G、Bともに同一の数字であり、その値はR、G、Bの各元素強度の平均値である
        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = (c.r + c.g + c.b) / 3;
            o.Alpha = c.a;
        }

    3.Lerpで2つの画像を混合してみる


    2つのテクスチャを入力し、数値を入力してlerp関数に適用します.

    学識

  • lerp関数の最後のパラメータは、どのテクスチャの数値
  • に近いか.
  • 0は1番目のテクスチャ、1は2番目のテクスチャ、0.5は正反対
    次のコードでは、コアはsurt関数で作成されたo.Albedo=lerp(tex 1.rgb、tex 2.rgb、lerpValue)である.はずです
    Shader "Custom/Lerp"
    {
        Properties
        {
            _MainTex ("Albedo (RGB)", 2D) = "white" {}
            _MainTex2 ("Albedo (RGB)", 2D) = "white" {}
            _lerpValue ("Lerp Value", Range(0,1)) = 0
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
            LOD 200
    
            CGPROGRAM
            #pragma surface surf Standard fullforwardshadows
    
            sampler2D _MainTex;
            sampler2D _MainTex2;
    
            struct Input
            {
                float2 uv_MainTex;
                float2 uv_MainTex2;
            };
    
            float _lerpValue;
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
                fixed4 tex1 = tex2D (_MainTex, IN.uv_MainTex);
                fixed4 tex2 = tex2D (_MainTex2, IN.uv_MainTex2);
                o.Albedo = lerp(tex1.rgb, tex2.rgb, _lerpValue);
                o.Alpha = 1;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }
    


    4.第1テクスチャのAlphaチャネル値をLerp()の第3パラメータとして使用


    本ではUnity StandardAssetのプール映像にAlphaチャネルがあると書いてあるので、持ってきてみます

    o.Albedo = lerp(tex1.rgb, tex2.rgb, tex1.a);
    前述したように、lerp()の3番目のパラメータプール画像のalpha値を使用する
    結果を予測すると…!
    白い部分は1であるべきですが、lerp()では、1は2番目のパラメータに入るテクスチャを表します.
    白い部分の草状の2番目のテクスチャが表示されます.

    また,実際に適用すると,上記の表現が見られる.
    o.Albedo = lerp(tex2.rgb, tex1.rgb, tex1.a);
    上記のように、1番目と2番目のパラメータの順序を変更すると、
    草の形には草のテクスチャがあり、残りの背景には夜空の背景があります.

    ああ、特別な感じがします.

    リファレンス

  • 技術芸術家のために設計されたUnitizer Start Up(鄭宗弼著)