4 / 4 Texture表示の比較と条件変更
同じテクスチャ、UV設定、Tintを使ったHLSLとShader Graphを比較します。座標の変更と色の変更を別々に確認します。
比較の基準を決めます
比較では、同じMesh、同じテクスチャ、同じUVの倍率と移動量を使います。両方のシェーダーはUnlitの不透明表示とし、最初のTintを白にします。第14回の最小例と同様に、比較環境のDepth Primingは無効にします。
色の比較には、同じプロジェクトと同じテクスチャのImport設定を使います。前期で扱った色空間やsRGB設定も、テクスチャを読んだ結果へ影響します。
| 処理 | Shader Graph | HLSL |
|---|---|---|
| UVを得る | UVノード | 頂点入力からUVを渡す |
| 倍率と移動量を適用する | Tiling And Offset | 掛け算と足し算 |
| テクスチャを参照する | Sample Texture 2D | SAMPLE_TEXTURE2D |
| 色を掛ける | Multiply | color * _Tint |
予測と結果を比較します
- U方向のTilingを
1から2へ変更し、画像の繰り返し方を確認してください。 - Tilingを戻してからU方向のOffsetを変更し、読む位置の変化を確認してください。
- Tintを白から赤へ変更し、UVの配置が変わらないことを確認してください。
- 画像の位置が正しくない場合は、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を読み、その後でプロパティの名前を照合してください。
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の役割を別々に説明できます。