HUD HP

801 words

来源

水群的时候跟人聊天,看到了使用 DrawMeshInstancedIndirect 来批量绘制网格来实现血量的显示,卖课39,感觉这东西我也能写,然后花了一上午错了一个出来玩

HUD-HP

效果

Image text
Image text

原理

通过 DrawMeshInstancedIndirect 的方式,在 ComputeBuffer 里存储对应的数据数组,Shader中通过 instanceId,获取对应的位置和hp值,进行渲染的显示

1
2
3
4
5
6
7
8

private void Update()
{
_hpBuffer.SetData(createActor.actorList);
hpMaterial.SetBuffer("_HpBuffer", _hpBuffer);
Graphics.DrawMeshInstancedIndirect(hpMesh, 0, hpMaterial, bounds, _argsBuffer, 0);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct Actor
{
float3 position;
float hp;
};
StructuredBuffer<Actor> _HpBuffer;

v2f vert (appdata v, uint instance_id : SV_InstanceID)
{
v2f o;
float3 actorPosition = _HpBuffer[instance_id].position;
v.vertex.xyz += actorPosition;
v.vertex.xy += _Offset.xy;

o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.hp = _HpBuffer[instance_id].hp;
return o;
}