Skip to content

改訂前の参考解説

このページは改訂前の教材です。現在の授業の回番号・内容は、後期の授業計画で確認してください。

第15回 補間・UV・テクスチャと色

4 / 4 Texture表示の比較と条件変更 ​

このステップの目的

同じテクスチャ、UV設定、Tintを使ったHLSLとShader Graphを比較します。座標の変更と色の変更を別々に確認します。

比較の基準を決めます ​

比較では、同じMesh、同じテクスチャ、同じUVの倍率と移動量を使います。両方のシェーダーはUnlitの不透明表示とし、最初のTintを白にします。第14回の最小例と同様に、比較環境のDepth Primingは無効にします。

色の比較には、同じプロジェクトと同じテクスチャのImport設定を使います。前期で扱った色空間やsRGB設定も、テクスチャを読んだ結果へ影響します。

処理Shader GraphHLSL
UVを得るUVノード頂点入力からUVを渡す
倍率と移動量を適用するTiling And Offset掛け算と足し算
テクスチャを参照するSample Texture 2DSAMPLE_TEXTURE2D
色を掛けるMultiplycolor * _Tint

予測と結果を比較します ​

  1. U方向のTilingを1から2へ変更し、画像の繰り返し方を確認してください。
  2. Tilingを戻してからU方向のOffsetを変更し、読む位置の変化を確認してください。
  3. Tintを白から赤へ変更し、UVの配置が変わらないことを確認してください。
  4. 画像の位置が正しくない場合は、UVを色として表示する処理に戻して原因を確認してください。

変更した値、変更前の予測、観察した結果を対応付けて説明してください。コードの全文を暗記することよりも、どの値がどの処理に使われるかを追えることが、この実習の到達点です。

変更箇所を選ぶ課題 ​

「模様の色を変えず、横に二回繰り返す」「配置を変えず、青の成分を消す」という二つの課題に対し、Tiling・Offset・Tintのどれを変えるか選んでください。変更前の予測と、変更した式を記録します。

考え方の確認

前者はTilingのUを2へ変え、TextureのWrapをRepeatにします。後者はTintの青成分を0にし、例えば(1,1,0,1)を使います。UVの式と色の式が独立していることを確認します。

提出後はTiling=(1,1)、Offset=(0,0)、Tint=白へ戻します。TextureTint.shaderとMaterialを保存し、次回は法線を追加します。

よくある問題を切り分けます ​

症状確認する内容
画像が単色のように見えるUVの受け渡し、UVの範囲、割り当てた画像を確認する
画像の端が引き延ばされるWrap ModeとUVの範囲を確認する
HLSL側だけ色が異なるTint、テクスチャ、色空間、Lit/Unlitの条件を確認する
変数が未定義になるPropertiesとHLSLの宣言に同じ名前があるかを確認する

参考実装 ​

次のコードでは、Propertiesがマテリアルに表示する項目を宣言します。先に二つの構造体とVert・Fragを読み、その後でプロパティの名前を照合してください。

shaderlab
Shader "Course/TextureTint"
{
    Properties
    {
        _BaseMap ("Texture", 2D) = "white" {}
        _Tint ("Tint", Color) = (1, 1, 1, 1)
    }

    SubShader
    {
        Tags { "RenderPipeline" = "UniversalPipeline" "RenderType" = "Opaque" }

        Pass
        {
            Tags { "LightMode" = "SRPDefaultUnlit" }

            HLSLPROGRAM
            #pragma vertex Vert
            #pragma fragment Frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float3 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            TEXTURE2D(_BaseMap);
            SAMPLER(sampler_BaseMap);

            CBUFFER_START(UnityPerMaterial)
                float4 _BaseMap_ST;
                float4 _Tint;
            CBUFFER_END

            Varyings Vert(Attributes input)
            {
                Varyings output;
                output.positionCS = TransformObjectToHClip(input.positionOS);
                output.uv = input.uv * _BaseMap_ST.xy + _BaseMap_ST.zw;
                return output;
            }

            float4 Frag(Varyings input) : SV_Target
            {
                float4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv);
                return color * _Tint;
            }
            ENDHLSL
        }
    }
}

_BaseMapのTilingとOffsetは、Unityが_BaseMap_STとして渡します。宣言の名前と対応は、Unity公式のテクスチャ表示の説明でも確認できます。

チェックリスト
  • 両方の表示は、同じMesh、テクスチャ、Tiling、Offset、Tintを使用しています。
  • 頂点関数はUVを出力し、フラグメント関数はそのUVを参照しています。
  • 画像の位置の問題を、UVを色として表示する処理で調べられます。
  • 取得した色とTintの役割を別々に説明できます。