Created
August 13, 2022 04:39
-
-
Save Tunied/d6f6a14c7246e9150488f326d3b33e4e to your computer and use it in GitHub Desktop.
Check the video for more explain https://youtu.be/aMEu6FcdxFQ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Can you post the material shader that you used?