🌈

そろそろShaderをやるパート52 タイリング、オフセット

2022/02/01に公開

そろそろShaderをやります

そろそろShaderをやります。そろそろShaderをやりたいからです。
パート100までダラダラ頑張ります。10年かかってもいいのでやります。
100記事分くらい学べば私レベルの初心者でもまあまあ理解できるかなと思っています。

という感じでやってます。

※初心者がメモレベルで記録するので
 技術記事としてはお力になれないかもしれません。

下準備

下記参考
そろそろShaderをやるパート1 Unite 2017の動画を見る(基礎知識~フラグメントシェーダーで色を変える)

デモ

ビルトインのShaderには当たり前のようにタイリングとオフセットがあります。
自作ShaderにおいてもTilingとOffsetという項目は存在しますが、何も実装しなければ動作しません。

自作Shaderにも組み込みたかったのでその手法を調べました。

Shaderサンプル

Shader "Custom/TilingOffset"
{
    Properties
    {
        //メインテクスチャー
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 scroll_uv : TEXCOORD0;
                float2 uv : TEXCOORD1;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 scroll_uv : TEXCOORD0;
                float2 uv : TEXCOORD1;
            };

            sampler2D _MainTex;
            //プロパティ上のタイリング、オフセットがこの変数に入ってくる
            float4 _MainTex_ST;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                //タイリング、オフセットを計算
                o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                //テクスチャーのサンプリング
                fixed4 tex_color = tex2D(_MainTex, i.uv);
                return tex_color;
            }
            ENDCG
        }
    }
}

{TextureName}_STでプロパティ上のタイリング、オフセットの値を取得できます。

それぞれの値は以下です。

x contains X tiling value
y contains Y tiling value
z contains X offset value
w contains Y offset value

その値を頂点Shader内のUV受け渡しの箇所で反映させるという手順です。


2022/03/05 追記

タイリング、オフセットを計算してくれるマクロが用意されていました。

o.uv = TRANSFORM_TEX(v.uv,_MainTex);

参考リンク

Accessing shader properties in Cg/HLSL
Unity でShaderの勉強 その1

Discussion