C# DX9 显示不完全

CodeZero 发布于 2015/07/31 10:37
阅读 111
收藏 0

如题

顶点缓冲跟索引的初始化如下

#region 高度图创建地形
        private VertexBuffer vertexBuffer;//定义顶点缓冲变量
        private IndexBuffer indexBuffer;//定义索引缓冲变量
        private int[] indices;//定义索引号变量
        private CustomVertex.PositionColored[] vertices;
        private int xCount = 5, yCount = 4;//定义横向和纵向网格数目
        private float cellHeight = 1f, cellWidth = 1.5f;//定义单元的宽度和长度
        Random rn = new Random();
        private void VertexDeclaration()    //定义顶点的缓冲
        {
            string bitmapPath = @"D:\h1.jpg";
            Bitmap bitmap = new Bitmap(bitmapPath);
            xCount = (bitmap.Width - 1) / 2;
            yCount = (bitmap.Height - 1) / 2;
            cellWidth = bitmap.Width / xCount;
            cellHeight = bitmap.Height / yCount;
            vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored),
            (xCount + 1) * (yCount + 1), device,
            Usage.Dynamic | Usage.WriteOnly,
            CustomVertex.PositionColored.Format, Pool.Default);
            vertices = new
            CustomVertex.PositionColored[(xCount + 1) * (yCount + 1)];//定义顶点
            for (int i = 0; i < yCount + 1; i++)
            {
                for (int j = 0; j < xCount + 1; j++)
                {
                    Color color = bitmap.GetPixel((int)(j * cellWidth), (int)(i *
                    cellHeight));
                    float height = float.Parse(color.R.ToString()) +
                    float.Parse(color.G.ToString()) + float.Parse(color.B.ToString());
                    height /= 10;
                    vertices[j + i * (xCount + 1)].Position = new Vector3(j *
                    cellWidth, height, i * cellHeight);
                    vertices[j + i * (xCount + 1)].Color = Color.FromArgb(rn.Next(256), rn.Next(256), rn.Next(256)).ToArgb();
                }
            }
            vertexBuffer.SetData(vertices, 0, LockFlags.None);
        }
        private void IndicesDeclaration()   //定义顶点的索引
        {
            indexBuffer = new IndexBuffer(typeof(int), 6 * xCount * yCount, device,
                Usage.WriteOnly, Pool.Default);
            indices = new int[6 * xCount * yCount];
            for (int i = 0; i < yCount; i++)
            {
                for (int j = 0; j < xCount; j++)
                {
                    indices[6 * (j + i * xCount)] = j + i * (xCount + 1);
                    indices[6 * (j + i * xCount) + 1] = j + (i + 1) * (xCount + 1);
                    indices[6 * (j + i * xCount) + 2] = j + i * (xCount + 1) + 1;
                    indices[6 * (j + i * xCount) + 3] = j + i * (xCount + 1) + 1;
                    indices[6 * (j + i * xCount) + 4] = j + (i + 1) * (xCount + 1);
                    indices[6 * (j + i * xCount) + 5] = j + (i + 1) * (xCount + 1)
                    + 1;
                }
            }
            indexBuffer.SetData(indices, 0, LockFlags.None);
        }
        #endregion

渲染如下

 public void Render()
        {
            if (device == null) //如果device为空则不渲染
            {
                return;
            }
            device.Clear(ClearFlags.Target, Color.DarkSlateBlue, 1.0f, 0); //清除windows界面为深蓝色
            
            device.BeginScene();
            //在此添加渲染图形代码
            device.RenderState.CullMode = Cull.None;
            device.RenderState.Lighting = false;


            //device.SetTexture(0, texture);//设置贴图


            device.VertexFormat = CustomVertex.PositionColored.Format;//顶点类型
            device.SetStreamSource(0, vertexBuffer, 0);//绑定缓冲
            device.Indices = indexBuffer;//绑定索引
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,(xCount + 1) * (yCount + 1), 0, indices.Length / 3);
            
            device.EndScene();
            device.Present();
        }

貌似成功创建了一个基于高度图的地形,但是显示不出来,好像这能看到类似于截面的东西,怎么破?

加载中
返回顶部
顶部