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();
}
效果图: