教程2:顶点渲染-C# Direct3D SDK 翻译(2)
C# Direct3D SDK 翻译2
教程2:顶点渲染
/Files/idiot8/Tutorial2.rar
MS Direct3D应用程序使用顶点渲染几何图形。任何一个3D场景都包含大量的几何图形。本教程首先按照教程1创建设备,接着创建一个最简单的一个三角形,显示出来
创建顶点缓存
本教程通过三个顶点来渲染一个2D的三角形,介绍了顶点缓存的概念。通常使用VertexBuffer对象来存放和渲染顶点。
任意组合CustomVertex中的预定义结构,能够按照你的要求,创建你想要的顶点结构。本教程中,顶点已经经过了转换,设置了其2D窗口坐标。(0,0)点代表着左上角,x轴的向右为正,y轴向下为正。这些顶点并没有使用光照,而是设置了本身的漫反射颜色。下面的程序片段就是设置顶点缓存的代码,顶点的结构是使用预定义结构CustomVertex.CustomVertex.TransformedColored
[C#]
public class Vertices : Form
{
// Global variables for this project
Device device = null; // Rendering device
VertexBuffer vb = null;
.
.
.
public void OnCreateDevice(object sender, EventArgs e)
{
Device dev = (Device)sender;

// Now create the vertex buffer
vertexBuffer = new VertexBuffer(
typeof(CustomVertex.TransformedColored), 3, dev, 0, 
CustomVertex.TransformedColored.Format, Pool.Default);
vertexBuffer.Created += 
new System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vb, null);
}

public void OnCreateVertexBuffer(object sender, EventArgs e)
{
VertexBuffer vb = (VertexBuffer)sender;
GraphicsStream stm = vb.Lock(0, 0, 0);
CustomVertex.TransformedColored[] verts =
new CustomVertex.TransformedColored[3];
.
.
.
vb.Unlock();
}
}

上面的代码中,调用VertexBuffer.Lock方法,使CPU直接存取顶点缓存中的数据,切记在使用了Lock方法后必须调用Unlock方法来释放缓存使用权。
初始化顶点
上面创建了一个包含三个顶点的数组,顶点结构CustomVertex.TransformedColored对应三角形的每个顶点的内容,包括坐标(x,y,z),缩放比例rhw和顶点颜色color。下面代码对顶点数组进行了初始化。ToArgb 方法将颜色值转换成ARGB 32-bit的格式
[C#]
verts[0].X=150; verts[0].Y=50; verts[0].Z=0.5f; verts[0].Rhw=1; 
verts[0].Color = System.Drawing.Color.Aqua.ToArgb();

verts[1].X=250; verts[1].Y=250; verts[1].Z=0.5f; verts[1].Rhw=1;
verts[1].Color = System.Drawing.Color.Brown.ToArgb();

verts[2].X=50; verts[2].Y=250; verts[2].Z=0.5f; verts[2].Rhw=1;
verts[2].Color = System.Drawing.Color.LightPink.ToArgb();

stm.Write(verts);

在上面代码中出现了GraphicsStream类stm,该类是用来绑定要使用的数据。在上面代码中,GraphicsStream直接写入顶点缓存,就是说,该类将设置好的顶点内容,按照流的方式写入到顶点缓存中。
渲染三角形
下面的代码揭示了怎样通过扩展教程1中的render方法,初始化渲染图源,顶点格式,以及调用Device的图元渲染来在屏幕上显示一个三角形。只要系统触发了paint事件,窗口类frm有效,三角形就会显示在屏幕上。
[C#]
private void Render()
{
if (device == null)
return;

// Clear the back buffer to a blue color (ARGB = 000000ff)
device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
// Begin the scene
device.BeginScene();

// New for Tutorial 2
device.SetStreamSource(0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);

// End the scene
device.EndScene();
device.Present();
}


浙公网安备 33010602011771号