예제 #1
0
        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;
            }
        }
예제 #3
0
        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;
        }
예제 #4
0
        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;
        }