forked from przemyslawzaworski/Unity3D-CG-programming
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVertexShaderTessellation.cs
68 lines (60 loc) · 1.95 KB
/
VertexShaderTessellation.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using UnityEngine;
using System;
using System.Collections.Generic;
[RequireComponent (typeof(Camera))]
public class VertexShaderTessellation : MonoBehaviour
{
public Shader TessellationShader;
[Range(1, 1024)] public int TessellationFactor = 5;
public UnityEngine.Rendering.CullMode CullMode = UnityEngine.Rendering.CullMode.Off;
ComputeBuffer _VertexBuffer;
Material _Material;
int _VertexCount = 0;
Vector4[] _Vertices;
byte[] ToByteArray(Vector4[] vectors)
{
byte[] bytes = new byte[sizeof(float) * vectors.Length * 4];
for (int i = 0; i < vectors.Length * 4; i++)
Buffer.BlockCopy(BitConverter.GetBytes(vectors[i / 4][i % 4]), 0, bytes, i*sizeof(float), sizeof(float));
return bytes;
}
void Start()
{
Mesh mesh = Resources.GetBuiltinResource<Mesh>("Quad.fbx");
List<Vector4> vertices = new List<Vector4>();
for (int i = 0; i < mesh.triangles.Length; i++)
{
Vector3 p = mesh.vertices[mesh.triangles[i]];
vertices.Add(new Vector4(p.x, p.y, p.z, 1.0f));
}
_Vertices = vertices.ToArray();
Camera.main.clearFlags = CameraClearFlags.SolidColor;
_Material = new Material(TessellationShader);
_VertexBuffer = new ComputeBuffer(4 * _Vertices.Length, sizeof(float), ComputeBufferType.Raw);
byte[] bytes = ToByteArray(_Vertices);
_VertexBuffer.SetData(bytes);
}
void OnPreRender()
{
GL.wireframe = true;
}
void OnPostRender()
{
_Material.SetBuffer("_VertexBuffer", _VertexBuffer);
_Material.SetInt("_TessellationFactor", TessellationFactor);
_Material.SetInt("_CullMode", (int)CullMode);
_Material.SetPass(0);
_VertexCount = TessellationFactor * TessellationFactor * _Vertices.Length;
Graphics.DrawProcedural(MeshTopology.Triangles, _VertexCount, 1);
}
void OnGUI()
{
GL.wireframe = false;
GUI.Label(new Rect(10, 10, 200, 30), "Vertex Count: " + _VertexCount.ToString());
}
void OnDestroy()
{
_VertexBuffer.Release();
Destroy(_Material);
}
}