docs.unity3d.com
    目次を表示する/隠す

    テクスチャの描画

    この例の Unity シェーダーは、メッシュ上にテクスチャを描画します。

    色の入力を備えた URP Unlit シェーダー セクションの Unity シェーダーソースファイルを使用し、ShaderLab コードに以下の変更を加えます。

    1. Properties ブロックで、既存のコードを _BaseMap プロパティの定義に置き換えます。

      Properties
      {
          [MainTexture] _BaseMap("Base Map", 2D) = "white"
      }
      

      Properties ブロックでテクスチャプロパティを宣言すると、Unity では _BaseMap プロパティが Base Map というラベルでマテリアルに追加され、Tiling (タイリング) コントロールおよび Offset (オフセット) コントロールが追加されます。

      "テクスチャプロパティの Tiling コントロールおよび Offset コントロール"

      [MainTexture] 属性のプロパティを宣言すると、Unity ではそのプロパティがマテリアルの メインテクスチャ として使用されます。

      ノート: 互換性を確保するため、_MainTex というプロパティ名はあらかじめ予約されています。Unity では、[MainTexture]属性がなくても_MainTex` という名前のプロパティが メインテクスチャ として使用されます。

    2. struct Attributes と struct Varyings で、テクスチャ上の UV 座標用に uv 変数を追加します。

      float2 uv           : TEXCOORD0;
      
    3. テクスチャを 2D テクスチャとして定義し、そのためのサンプラーを指定します。CBUFFER ブロックの前に以下の行を追加します。

      TEXTURE2D(_BaseMap);
      SAMPLER(sampler_BaseMap);
      

      TEXTURE2D マクロおよび SAMPLER マクロは Core.hlsl 内で参照されているファイルの 1 つに定義されています。

    4. タイリングとオフセットを機能させるには、テクスチャプロパティを _ST サフィックスとともに 'CBUFFER' ブロック内で宣言する必要があります。_ST サフィックスが必要なのは、一部のマクロ (TRANSFORM_TEX など) で使用されるからです。

      ノート: Unity シェーダーと SRP Batcher の互換性を確保するため、マテリアルのすべてのプロパティを単一の CBUFFER ブロック内で UnityPerMaterial という名前で宣言します。SRP Batcher について詳しくは、SRP (スクリプタブルレンダーパイプライン) Batcher のページを参照してください。

      CBUFFER_START(UnityPerMaterial)
          float4 _BaseMap_ST;
      CBUFFER_END
      
    5. タイリングとオフセットの変換を適用するには、以下の行を頂点シェーダーに追加します。

      OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
      

      TRANSFORM_TEX マクロは Macros.hlsl ファイル内に定義されています。#include 宣言には、そのファイルへの参照が含まれます。

    6. フラグメントシェーダーで、SAMPLE_TEXTURE2D マクロを使用してテクスチャをサンプリングします。

      half4 frag(Varyings IN) : SV_Target
      {
          half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
          return color;
      }
      

    これで、Inspector ウィンドウの Base Map フィールドでテクスチャを選択できるようになりました。選択したテクスチャがシェーダーによってメッシュ上に描画されます。

    マテリアルの Base Map テクスチャ

    以下は、この例の完成した ShaderLab コードです。

    // このシェーダーはメッシュ上にテクスチャを描画します。
    Shader "Example/URPUnlitShaderTexture"
    {
        // _BaseMap 変数はマテリアルの Inspector に Base Map フィールドとして
        // 表示されます。
        Properties
        {
            [MainTexture] _BaseMap("Base Map", 2D) = "white"
        }
    
        SubShader
        {
            Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
    
            Pass
            {
                HLSLPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    
                struct Attributes
                {
                    float4 positionOS   : POSITION;
                    // uv 変数には特定の頂点のテクスチャにおける UV 座標が
                    // 含まれます。
                    float2 uv           : TEXCOORD0;
                };
    
                struct Varyings
                {
                    float4 positionHCS  : SV_POSITION;
                    // uv 変数には特定の頂点のテクスチャにおける UV 座標が
                    // 含まれます。
                    float2 uv           : TEXCOORD0;
                };
    
                // このマクロは _BaseMap を Texture2D オブジェクトとして宣言します。
                TEXTURE2D(_BaseMap);
                // このマクロは _BaseMap テクスチャのサンプラーを宣言します。
                SAMPLER(sampler_BaseMap);
    
                CBUFFER_START(UnityPerMaterial)
                    // 以下の行では、フラグメントシェーダーで _BaseMap 変数を
                    // 使用できるように _BaseMap_ST 変数を宣言します。タイリングおよび
                    // オフセットを機能させるために _ST サフィックスが必要です。
                    float4 _BaseMap_ST;
                CBUFFER_END
    
                Varyings vert(Attributes IN)
                {
                    Varyings OUT;
                    OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                    // TRANSFORM_TEX マクロはタイリングとオフセットの
                    // 変換を行います。
                    OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
                    return OUT;
                }
    
                half4 frag(Varyings IN) : SV_Target
                {
                    // SAMPLE_TEXTURE2D マクロは指定されたサンプラーでテクスチャを
                    // サンプリングします。
                    half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
                    return color;
                }
                ENDHLSL
            }
        }
    }
    

    法線ベクトルの可視化 セクションには、メッシュ上に法線ベクトルを可視化する方法が記載されています。

    トップに戻る
    Copyright © 2023 Unity Technologies — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)