模型涂抹案例分享(完整原码)

本文是模型的UV涂抹案例,按照惯例,先上图:
在这里插入图片描述
在这里插入图片描述
好啦,下面开始讲解:
一、为了可以让射线可以检测到模型表面,我们需要为模型添加一个MeshCollider,模型材质使用普通的Standard准备材质即可。
在这里插入图片描述
二、准备笔刷材质,不需要目标纹理的,不赋值就可以了,下面是材质代码。
在这里插入图片描述
笔刷Shader原码:

Shader "Giraffe/SingleBursh"
{
	Properties
	{
		_TargetTex("目标图形",2D) = "white" {}
		_BrushTex("刷子形状",2D) = "white" {}
		_Color("Color",Color) = (1,1,1,1)
		_UV("UV",Vector) = (0,0,0,0)
		_SizeX("SizeX",Range(1,100)) = 1
		_SizeY("SizeY",Range(1,100)) = 1
		_Alpha("刷子权重",Range(0,1)) = 0.2
	}
	SubShader
	{
		Tags { "RenderType" = "Transparent" }
		LOD 100
		ZTest Always Cull Off ZWrite Off Fog{ Mode Off }
		Blend SrcAlpha OneMinusSrcAlpha
		//Blend One DstColor
		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;
			};

			sampler2D _BrushTex;
			sampler2D _TargetTex;
			float4 _TargetTex_ST;
			fixed4 _UV;
			float _SizeX;
			float _SizeY;
			fixed4 _Color;
			float _Alpha;

			v2f vert(appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _TargetTex);
				return o;
			}

			fixed4 frag(v2f i) : SV_Target
			{
				float2 _Size = float2(_SizeX,_SizeY);
				float2 uv = i.uv + (0.5f / _Size);
				uv = uv - _UV.xy;
				uv *= _Size;
				fixed4 col = tex2D(_BrushTex, uv);
				
				col.rgb = 1;
				fixed4 col2 = tex2D(_TargetTex, i.uv);
				col *= _Color;

				half4 RGB = col* col2;

				return half4(RGB.rgb, RGB.a*_Alpha);
			}
			ENDCG
		}
	}
}

三、下面是鼠标点击部分,通过发射射线检测到点击的位置的UV,代码如下:

    RaycastHit hit;
	Ray ray;
    ray = Camera.main.ScreenPointToRay(Input.mousePosition);                //摄像机发射射线到屏幕点。
    Debug.DrawRay(ray.origin, ray.direction * 100, Color.red, 0.1f);		//可以在Screen窗口看到射线轨迹
    if (Physics.Raycast(ray, out hit, 100f))
    {
    
    
	    Vector2 pixelUV = hit.textureCoord;									//得到点击位置所在UV值
	    BrushHandle(pixelUV);
	}

四、主逻辑部分,这个直接用MonoBehaviour直接挂上去即可。

	public RenderTexture m_renderTex;                                  //渲染图
    public Texture m_texOriginal;                                      //起始模型图
    public Texture m_texTarget;                                        //笔刷纹理图
    public Material m_matMain;                                         //星球材质
    public Material m_matBrush;                                        //刷子材质

	 private void ReadyBrushObj()
    {
    
    
        //创建渲染纹理
        m_renderTex = RenderTexture.GetTemporary(2048, 2048, 24);
        //将默认图片赋值给渲染纹理
        Graphics.Blit(m_texOriginal, m_renderTex);
        //将默渲染纹理赋值给模型材质主图
        m_matMain.SetTexture("_MainTex", m_renderTex);
        //将笔刷纹理赋值给纹理图(可选)
        m_matBrush.SetTexture("_TargetTex", m_texTarget);
    }
            
	private void __BrushHandle(Vector2 minUv)
    {
    
    
    	m_matBrush.SetVector("_UV", minUv);
		Graphics.Blit(m_renderTex, m_renderTex, m_matBrush);
    }

以上是完整内容。
下面是工程Demo,有问题可以私信我:
https://download.csdn.net/download/ww1351646544/21043484?spm=1001.2014.3001.5503

猜你喜欢

转载自blog.csdn.net/ww1351646544/article/details/119633337