Skip to content

Instantly share code, notes, and snippets.

@Tunied
Created August 13, 2022 04:39
Show Gist options
  • Save Tunied/d6f6a14c7246e9150488f326d3b33e4e to your computer and use it in GitHub Desktop.
Save Tunied/d6f6a14c7246e9150488f326d3b33e4e to your computer and use it in GitHub Desktop.
Check the video for more explain https://youtu.be/aMEu6FcdxFQ
using System.Collections.Generic;
using UnityEngine;
namespace Code
{
/// <summary>
/// The simplest example to show how to use Graphics.DrawProceduralIndirect
///
/// What it does:
///
/// - just draw a triangle on scene
///
/// How it dose :
///
/// - push Vertex data to a ComputeBuffer and upload to video card memory
/// - use a custom shader to read that part data and render a triangle
///
/// </summary>
public class Mono_Code : MonoBehaviour
{
public Material MT;
private ComputeBuffer mArgBuffer;
private Bounds mBounds;
private ComputeBuffer mVertexBuffer;
private GraphicsBuffer mIndexBuffer;
void Start()
{
mVertexBuffer = new ComputeBuffer(3, sizeof(float) * 3, ComputeBufferType.Structured, ComputeBufferMode.Immutable);
mVertexBuffer.SetData(GetVertexData_List());
mIndexBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Index, 3, sizeof(int));
mIndexBuffer.SetData(GetIndexData_List());
MT.SetBuffer("VertexDataArray", mVertexBuffer);
mBounds = new Bounds(Vector3.zero, new Vector3(100, 100, 100)); //用于快速剔除
mArgBuffer = new ComputeBuffer(1, sizeof(int) * 5, ComputeBufferType.IndirectArguments);
// index-0 : 每个实例有多少个顶点
// index-1 : 有多少个实例
// index-2 : start vertex location
// index-3 : start instance location
mArgBuffer.SetData(new int[] {3, 1, 0, 0, 0});
}
private List<Vector3> GetVertexData_List()
{
var result = new List<Vector3>();
result.Add(new Vector3(-1.5f, 0, 0));
result.Add(new Vector3(1.5f, 0, 0));
result.Add(new Vector3(0, 0, 1.5f));
return result;
}
private List<int> GetIndexData_List()
{
var result = new List<int>();
result.Add(0);
result.Add(1);
result.Add(2);
return result;
}
private void Update() { Graphics.DrawProceduralIndirect(MT, mBounds, MeshTopology.Triangles, mIndexBuffer, mArgBuffer); }
private void OnDestroy()
{
if (mVertexBuffer != null)
{
mVertexBuffer.Release();
mVertexBuffer = null;
}
if (mArgBuffer != null)
{
mArgBuffer.Release();
mArgBuffer = null;
}
if (mIndexBuffer != null)
{
mIndexBuffer.Release();
mIndexBuffer = null;
}
}
}
}
@besteon
Copy link

besteon commented Nov 22, 2022

Can you post the material shader that you used?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment