Instancing+材质属性块
适应一个材质去实现一些参数不同的效果,占用一个drawcall,这种性价比特别高的方案,可以用在很多地方。
C#部分:
using UnityEngine;
[ExecuteInEditMode]
public class MiniMapProperties : MonoBehaviour
{
public int m_Index = 1;
public int m_ColNum = 3;
public int m_RowNum = 3;
private Vector4 m_MainTex_ST = new Vector4(1, 1, 0, 0);
private static MaterialPropertyBlock propertyBlock;
private static int MainTex_ST = Shader.PropertyToID("_MainTex_ST");
void Awake()
{
OnValidate();
}
private void OnEnable()
{
OnValidate();
}
private void Update()
{
OnValidate();
}
void OnValidate()
{
if (propertyBlock == null)
{
propertyBlock = new MaterialPropertyBlock();
}
int index = m_Index - 1;
float xDelta = 1.0f / m_ColNum;
float yDelta = 1.0f / m_RowNum;
float col = index % m_ColNum;
float row = index / m_ColNum;
m_MainTex_ST.x = xDelta;
m_MainTex_ST.y = yDelta;
m_MainTex_ST.z = col * xDelta;
m_MainTex_ST.w = 1 - xDelta - row * yDelta;
propertyBlock.SetVector(MainTex_ST, m_MainTex_ST);
GetComponent<MeshRenderer>().SetPropertyBlock(propertyBlock);
}
}
shader部分:
Shader "Tools/MiniMap"
{
Properties
{
_MainTex("Diffuse", 2D) = "white" {}
}
SubShader
{
Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" }
Blend SrcAlpha OneMinusSrcAlpha
Cull Off
ZWrite Off
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(half4, _MainTex_ST)
UNITY_INSTANCING_BUFFER_END(Props)
v2f vert(appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
float4 mainTexST = UNITY_ACCESS_INSTANCED_PROP(Props, _MainTex_ST);
o.uv = v.uv * mainTexST.xy + mainTexST.zw;
return o;
}
float4 frag(v2f i) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
half4 main = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
return main;
}
ENDHLSL
}
}
}