テクスチャの描画
この例の Unity シェーダーは、メッシュ上にテクスチャを描画します。
色の入力を備えた URP Unlit シェーダー セクションの Unity シェーダーソースファイルを使用し、ShaderLab コードに以下の変更を加えます。
Properties ブロックで、既存のコードを
_BaseMap
プロパティの定義に置き換えます。Properties { [MainTexture] _BaseMap("Base Map", 2D) = "white" }
Properties ブロックでテクスチャプロパティを宣言すると、Unity では
_BaseMap
プロパティが Base Map というラベルでマテリアルに追加され、Tiling (タイリング) コントロールおよび Offset (オフセット) コントロールが追加されます。[MainTexture]
属性のプロパティを宣言すると、Unity ではそのプロパティがマテリアルの メインテクスチャ として使用されます。ノート: 互換性を確保するため、
_MainTex
というプロパティ名はあらかじめ予約されています。Unity では、[MainTexture]属性がなくても
_MainTex` という名前のプロパティが メインテクスチャ として使用されます。struct Attributes
とstruct Varyings
で、テクスチャ上の UV 座標用にuv
変数を追加します。float2 uv : TEXCOORD0;
テクスチャを 2D テクスチャとして定義し、そのためのサンプラーを指定します。CBUFFER ブロックの前に以下の行を追加します。
TEXTURE2D(_BaseMap); SAMPLER(sampler_BaseMap);
TEXTURE2D マクロおよび SAMPLER マクロは
Core.hlsl
内で参照されているファイルの 1 つに定義されています。タイリングとオフセットを機能させるには、テクスチャプロパティを
_ST
サフィックスとともに 'CBUFFER' ブロック内で宣言する必要があります。_ST
サフィックスが必要なのは、一部のマクロ (TRANSFORM_TEX
など) で使用されるからです。ノート: Unity シェーダーと SRP Batcher の互換性を確保するため、マテリアルのすべてのプロパティを単一の
CBUFFER
ブロック内でUnityPerMaterial
という名前で宣言します。SRP Batcher について詳しくは、SRP (スクリプタブルレンダーパイプライン) Batcher のページを参照してください。CBUFFER_START(UnityPerMaterial) float4 _BaseMap_ST; CBUFFER_END
タイリングとオフセットの変換を適用するには、以下の行を頂点シェーダーに追加します。
OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
TRANSFORM_TEX
マクロはMacros.hlsl
ファイル内に定義されています。#include
宣言には、そのファイルへの参照が含まれます。フラグメントシェーダーで、
SAMPLE_TEXTURE2D
マクロを使用してテクスチャをサンプリングします。half4 frag(Varyings IN) : SV_Target { half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv); return color; }
これで、Inspector ウィンドウの 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
}
}
}
法線ベクトルの可視化 セクションには、メッシュ上に法線ベクトルを可視化する方法が記載されています。