Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Разные материалы не потребуются если использовать MaterialPropertyBlock
В тоже время тестирование этой же сцены на macbook pro 15 с интегрированной видеокартой показывает не завидный результат в пользу GPU(безбожно проигрывает), что неудивительно.Предложение так составлено что, возможно, имелось в виду CPU, допустили опечатку? (или CPU безбожно проигрывает?) А насколько проигрывает?
using UnityEngine;
public sealed class DrawMeshInstanced : MonoBehaviour {
[SerializeField]
private Mesh instancedMesh; // Set from editor
[SerializeField]
private Material material; // Set from editor
[SerializeField]
private int meshCount = 1023;
private Matrix4x4[] matrices;
private Vector3[] positions;
private MaterialPropertyBlock block;
private void Start() {
matrices = new Matrix4x4[meshCount];
for (int i = 0; i < matrices.Length; i++) {
matrices[i] = Matrix4x4.TRS(Random.insideUnitSphere * 10f, Random.rotationUniform, Vector3.one * Random.Range(0.5f, 1f));
}
block = new MaterialPropertyBlock();
block.SetColor("_Color", Color.red);
}
private void Update() {
Graphics.DrawMeshInstanced(instancedMesh, 0, material, matrices, meshCount, block);
}
}
Впрочем, это нельзя сделать только через DrawMeshInstanced.
StructuredBuffer<«float4»> ColorBuffer;
ColorBuffer.SetData(Colors);
instanceMaterial.SetBuffer("ColorBuffer", ColorBuffer);#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
col = СolorBuffer[unity_InstanceID];
#else
col = float4(0, 0, 1, 1);
#endifUnity делает все сама, даже с поддержкой мобильных устройств!
We have found a way to reduce CPU cost and supplement GPU Instancing in Unity with Animation Instancing. You can get our code on GitHub. Be aware that this is custom experimental solution, we’ve only shared it with a few of our enterprise support customers until recently.
Before using instancing for characters, we need to generate the animations. We generated the animations of a character into textures. These textures are called Animation Texture. The textures are used in skinning on GPU.Вкратце – нужно запечь анимации в текстуру для дальнешейго использования на GPU. Что-то мне это напоминает…
public class InstancingMaterial : MonoBehaviour
{
public Color color;
static private MaterialPropertyBlock props;
// Start is called before the first frame update
void Start()
{
if (props == null)
props = new MaterialPropertyBlock();
MeshRenderer renderer = GetComponent<MeshRenderer>();
props.SetColor("_Color", color);
renderer.SetPropertyBlock(props);
}
}Ну и в шейдер как uniform передавать текущее время.Unity Shader Variables уже передается Time разных мастей: текущее, от синуса/косинуса, дельта и все это в четырех масштабах.
Скелетная анимация на стороне видеокарты