C# Managed DirectX 绘制静止三角形(高效版本)

CustomVertex.TransformedColored将顶点定义在托管堆中,如果顶点的数组放在图形卡的显存中,将极大地增加绘制图形的速度。

可用VertexBuffer类为数组申请存储空间,指定顶点数组的存放位置。


VertexBuffer构造函数:

public VertexBuffer(Type typeVertexType, int numVerts, Device device, Usage usage, VertexFormats vertexFormat, Pool pool);

第一个参数是顶点类型

第二个参数是顶点个数

第三个参数是Device对象

第四个参数一般为0

第五个参数是顶点格式

第六个参数是存放的位置,可以是Scratch、SystemMemory、Managed、Default,一般选择Default,让系统决定具体的位置


Device对象可能被重置,所以放到图形卡显存中的顶点数组数据可能会丢失,必须重建VertexBuffer对象中顶点数组的数据。

在需要重建VertexBuffer对象时,系统产生CreateVertexBuffer事件。

此时,还必须使用Device类的另一个绘制图形的方法:

public void DrawPrimitives(PrimitiveType primitiveType, int startVertex, int primitiveCoun);

第一个参数是平面图形的类型,可以是TriangleFan、TriangleStrip、TriangleList、LineStrip、LineList、PointList

第二个参数是绘制平面图形时第一个顶点的索引号

第三个参数是所画图形的个数


增加变量:

private VertexBuffer vertexBuffer;

增加事件处理函数:

        public void OnCreateVertexBuffer(object sender, EventArgs e)
        {
            CustomVertex.TransformedColored[] verts = 
                (CustomVertex.TransformedColored[]) ((VertexBuffer)sender).Lock(0, 0);
            verts[0].X = 150.0f;
            verts[0].Y = 50.0f;
            verts[0].Z = 0.5f;
            verts[0].Rhw = 1.0f;
            verts[0].Color = Color.Red.ToArgb();
            verts[1].X = 250.0f;
            verts[1].Y = 250.0f;
            verts[1].Z = 0.5f;
            verts[1].Rhw = 1.0f;
            verts[1].Color = Color.Green.ToArgb();
            verts[2].X = 50.0f;
            verts[2].Y = 250.0f;
            verts[2].Z = 0.5f;
            verts[2].Rhw = 1.0f;
            verts[2].Color = Color.Blue.ToArgb();
            this.vertexBuffer.Unlock();
        }

修改OnCreateDevice方法:

        public void OnCreateDevice(object sender, EventArgs e)
        {
            /*
             * 其他Device初始化工作;
             */
            Device dev = (Device) sender;
            this.vertexBuffer = new VertexBuffer(
                typeof(CustomVertex.TransformedColored),
                3,
                dev,
                0,
                CustomVertex.TransformedColored.Format,
                Pool.Default);
            this.vertexBuffer.Created += this.OnCreateVertexBuffer;
            this.OnCreateVertexBuffer(this.vertexBuffer, null);
        }

修改渲染方法:

public void Render()
        {
            if (this.device == null)
                return;
            if (this.pause) //当窗口最小化或者不是可视化时,停止渲染;
                return;
            this.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.WhiteSmoke, 1.0f, 0);
            this.device.BeginScene();
            /*
             * 渲染代码必须放在这里;
             */
            this.device.SetStreamSource(0, this.vertexBuffer, 0);
            this.device.VertexFormat = CustomVertex.TransformedColored.Format;
            this.device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
            this.device.EndScene();
            this.device.Present();
        }

效果图:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值