ワールド座標でテクスチャの合成

ワールド座標でテクスチャの合成

 以前、Textureを合成するShaderであるテクスチャに他のテクスチャを合成する方法を掲載しました。この時は、uv座標を使用していましたが、今回はワールド座標を用いてテクスチャの合成を行います。

shader

 ここに掲載しているshaderのuv座標をワールド座標(x,z)へ変更したshaderです。このshaderにおいて_PaintPositionのy成分をz座標として使用しています。

Shader "Unlit/Paint_World"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_PaintTex ("BlushTexture", 2D) = "white" {}
		_PaintPosition ("Paint Position", VECTOR) = (0.0, 0.0, 0, 0)
		_Size ("PaintSize", Range(0.001, 10.0)) = 1.0
    }
    SubShader
    {
		Tags { "RenderType"="Transparent" "Queue"="Transparent" }

		ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

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

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

			sampler2D _MainTex;
			float4 _MainTex_ST;

			sampler2D _PaintTex;
			float4 _PaintTex_ST;

			float2 _PaintPosition;
			float _Size;

            v2f vert (appdata v)
            {
                v2f o;
				float4 vt = v.vertex;
                o.vertex = UnityObjectToClipPos(vt);
				o.worldPos = mul(unity_ObjectToWorld, vt);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
				float3 worldPos = i.worldPos;
				float size = _Size * 0.5;
				float2 p = _PaintPosition;
			
				float com;
				com = step(p.x - size, worldPos.x);
				com = step(worldPos.x, p.x + size) * com;
				com = step(p.y - size, worldPos.z) * com;
				com = step(worldPos.z, p.y + size) * com;

				fixed4 col_1 = tex2D(_MainTex, i.uv);
				fixed4 col_2 = tex2D(_PaintTex, (worldPos.xz - p) * 0.5 / size + 0.5);

				col_2.a = col_2.a * com;
				fixed alpha = col_2.a + (1 - col_2.a) * col_1.a;
				fixed4 col = fixed4((col_2.rgb * col_2.a + (col_1.rgb * col_1.a * (1 - col_2.a))) / alpha, 1.0);
				return col;
            }
            ENDCG
        }
    }
}

実行結果

 ワールド座標で計算することで、同じマテリアルを持つオブジェクトが複数存在するとき、uv座標の場合はオブジェクトごとにテクスチャが合成されるのに対し、ワールド座標の場合は指定した場所のみテクスチャが合成されるようになります。

ただし、平面を傾け(x=70°)、y方向から見ると

このように合成したテクスチャは伸びてしまいます。

  • 前の記事
    平面の鏡面反射(Cubemap)

    平面の鏡面反射(Cubemap) 2019.10.14


  • Warning: Trying to access array offset on value of type bool in /home/empty/karanokan.info/public_html/wp-content/themes/lionblog/single.php on line 223

    Warning: Trying to access array offset on value of type bool in /home/empty/karanokan.info/public_html/wp-content/themes/lionblog/single.php on line 224

    Warning: Trying to access array offset on value of type bool in /home/empty/karanokan.info/public_html/wp-content/themes/lionblog/single.php on line 225
  • 次の記事
    NO IMAGE

    Scriptによるレンダーテクスチャへの数値書き込みについて 2019.11.06