private void BuildVertexLayout() { var vertexDesc = VertexPN.GetVertexDescription(); var passDesc = _tech.GetPassByIndex(0).Description; _inputLayout = new D3D11.InputLayout(Device, passDesc.Signature, vertexDesc); }
public static void CreateVertexBuffer(Mesh mesh, ref ComputeBuffer ret, ref int num_vertices, VertexFormat fmt = VertexFormat.Full) { int[] indices = mesh.GetIndices(0); switch (fmt) { case VertexFormat.P: { Vector3[] vertices = mesh.vertices; VertexP[] v = new VertexP[indices.Length]; if (vertices != null) { for (int i = 0; i < indices.Length; ++i) { v[i].vertex = vertices[indices[i]]; } } ret = new ComputeBuffer(indices.Length, VertexP.size); ret.SetData(v); num_vertices = v.Length; } break; case VertexFormat.PU: { Vector3[] vertices = mesh.vertices; Vector2[] uv = mesh.uv; VertexPU[] v = new VertexPU[indices.Length]; if (vertices != null) { for (int i = 0; i < indices.Length; ++i) { v[i].vertex = vertices[indices[i]]; } } if (uv != null) { for (int i = 0; i < indices.Length; ++i) { v[i].uv = uv[indices[i]]; } } ret = new ComputeBuffer(indices.Length, VertexPU.size); ret.SetData(v); num_vertices = v.Length; } break; case VertexFormat.PN: { Vector3[] vertices = mesh.vertices; Vector3[] normals = mesh.normals; VertexPN[] v = new VertexPN[indices.Length]; if (vertices != null) { for (int i = 0; i < indices.Length; ++i) { v[i].vertex = vertices[indices[i]]; } } if (normals != null) { for (int i = 0; i < indices.Length; ++i) { v[i].normal = normals[indices[i]]; } } ret = new ComputeBuffer(indices.Length, VertexPN.size); ret.SetData(v); num_vertices = v.Length; } break; case VertexFormat.Full: { Vector3[] vertices = mesh.vertices; Vector3[] normals = mesh.normals; Vector4[] tangents = mesh.tangents; Vector2[] uv = mesh.uv; VertexFull[] v = new VertexFull[indices.Length]; if (vertices != null) { for (int i = 0; i < indices.Length; ++i) { v[i].vertex = vertices[indices[i]]; } } if (normals != null) { for (int i = 0; i < indices.Length; ++i) { v[i].normal = normals[indices[i]]; } } if (tangents != null) { for (int i = 0; i < indices.Length; ++i) { v[i].tangent = tangents[indices[i]]; } } if (uv != null) { for (int i = 0; i < indices.Length; ++i) { v[i].uv = uv[indices[i]]; } } ret = new ComputeBuffer(indices.Length, VertexFull.size); ret.SetData(v); num_vertices = v.Length; } break; } }
RenderElement CreateGrass(int numSubdivisions, int numElements, int numSides) { VertexPN[] vertices = new VertexPN[numSides * (numSubdivisions + 1) * numElements]; float deltaTheta = 360.0f / (float)numSides; float deltaHeight = 1.0f / (float)numSubdivisions; Random randomGen = new Random(); float grassRadius = 0.08f; for (int k = 0; k < numElements; k++) { float randomX = (float)(randomGen.NextDouble()*2.0-1.0); float randomZ = (float)(randomGen.NextDouble()*2.0-1.0); Vector3 randomCenter = new Vector3(randomX, 0.0f, randomZ); for (int i = 0; i < numSides; i++) { float a = MathHelper.ToRadians(deltaTheta * i); Vector3 pos = new Vector3((float)Math.Cos(a) * grassRadius, 0, (float)Math.Sin(a) * grassRadius); pos = pos + randomCenter; int index = (k * numSides + i) * (numSubdivisions + 1); for (int j = 0; j <= numSubdivisions; j++) { vertices[index + j].Position = pos + Vector3.Up * deltaHeight * j; if (j == numSubdivisions) { pos.X = randomCenter.X; pos.Z = randomCenter.Z; } } } } ushort[] indices = new ushort[3 * numSides * (numSubdivisions + 1) * numElements]; for (int k = 0; k < numElements; k++) { for (int i = 0; i < numSides; i++) { for (int j = 0; j <= numSubdivisions; j++) { int vertStride = numSubdivisions + 1; int index = (k * numSides + i) * 3 * (numSubdivisions + 1); int indexVert = i * (numSubdivisions+1) + j; indices[index] = (ushort)(indexVert + 1); indices[index + 1] = (ushort)indexVert; indices[index + 2] = (ushort)(indexVert + vertStride); indices[index + 3] = (ushort)(indexVert + vertStride); indices[index + 4] = (ushort)(indexVert + vertStride + 1); indices[index + 5] = (ushort)(indexVert + 1); if (i == numSides - 1) { indices[index + 2] = (ushort)j; indices[index + 4] = (ushort)(j+1); indices[index + 3] = (ushort)j; } } } } RenderElement element = new RenderElement(); element.VertexBuffer = new VertexBuffer(GFX.Device, vertices.Length * VertexPN.SizeInBytes, BufferUsage.WriteOnly); element.VertexBuffer.SetData<VertexPN>(vertices); element.StartVertex = 0; element.VertexStride = VertexPN.SizeInBytes; element.VertexDec = GFXVertexDeclarations.PNDec; element.VertexCount = vertices.Length; element.IndexBuffer = new IndexBuffer(GFX.Device, sizeof(ushort) * indices.Length, BufferUsage.WriteOnly, IndexElementSize.SixteenBits); element.IndexBuffer.SetData<ushort>(indices); element.PrimitiveCount = indices.Length / 3; return element; }
RenderElement CreateGrass2(int numSubdivisions, int numElements, int numSides) { List<VertexPN> grassVerts = new List<VertexPN>(); List<ushort> grassIB = new List<ushort>(); Random randomGen = new Random(); float grassRadiusMin = 0.01f; float grassRadiusMax = 0.075f; for (int k = 0; k < numElements; k++) { VertexPN[] vertices = new VertexPN[numSides * (numSubdivisions + 1)]; float deltaTheta = 360.0f / (float)numSides; Vector3 randomPos = new Vector3((float)(randomGen.NextDouble()), 0, (float)(randomGen.NextDouble())); float randomRadius = MathHelper.Lerp(grassRadiusMin, grassRadiusMax, (float)randomGen.NextDouble()); for (int i = 0; i < numSides; i++) { float a = MathHelper.ToRadians(deltaTheta * i); float deltaHeight = 1.0f / (float)numSubdivisions; Vector3 pos = new Vector3((float)Math.Cos(a) * randomRadius, 0, (float)Math.Sin(a) * randomRadius) + randomPos; for (int j = 0; j <= numSubdivisions; j++) { pos.Y = deltaHeight * j; int index = i * (numSubdivisions + 1); vertices[index + j].Position = pos; } } ushort[] indices = new ushort[6 * numSides * numSubdivisions]; for (int j = 0; j < numSubdivisions; j++) { for (int i = 0; i < numSides; i++) { int index = (i + j * numSides) * 6; int indexVert = i * (numSubdivisions+1) + j + grassVerts.Count; indices[index] = (ushort)(indexVert + 1); indices[index + 1] = (ushort)indexVert; indices[index + 2] = (ushort)(indexVert + (numSubdivisions + 1)); indices[index + 3] = (ushort)(indexVert + (numSubdivisions + 1)); indices[index + 4] = (ushort)(indexVert + (numSubdivisions + 1)+1); indices[index + 5] = (ushort)(indexVert + 1); if (i == numSides - 1) { indices[index + 2] = (ushort)(j + grassVerts.Count); indices[index + 4] = (ushort)(j + 1 + grassVerts.Count); indices[index + 3] = (ushort)(j + grassVerts.Count); } } } grassVerts.AddRange(vertices); grassIB.AddRange(indices); } RenderElement element = new RenderElement(); element.VertexBuffer = new VertexBuffer(GFX.Device, grassVerts.Count * VertexPN.SizeInBytes, BufferUsage.WriteOnly); element.VertexBuffer.SetData<VertexPN>(grassVerts.ToArray()); element.StartVertex = 0; element.VertexStride = VertexPN.SizeInBytes; element.VertexDec = GFXVertexDeclarations.PNDec; element.VertexCount = grassVerts.Count; element.IndexBuffer = new IndexBuffer(GFX.Device, sizeof(ushort) * grassIB.Count, BufferUsage.WriteOnly, IndexElementSize.SixteenBits); element.IndexBuffer.SetData<ushort>(grassIB.ToArray()); element.PrimitiveCount = grassIB.Count / 3; return element; }