使用Vertex Buffer绘制基本几何形状

本文介绍如何在XNA中使用VertexBuffer绘制基本几何形状,包括设置顶点数据、使用不同的几何模型类型以及填充模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Vertex Buffer绘制基本几何形状

在前面的文章有稍微介绍了XNAXNA Rendering Pipeline

现在,让我们开始从头了解吧!!

(也许有人会好奇,怎么会要讲这个...因为这个部分是很重要的,所以我才特别在往回写,熟悉Vertex bufferindex buffer,在后面处理一些模型的几何会很有帮助)

使用环境:

Visual Studio C# 2008任意版本

XNA 3.1

新增完毕XNA GS(game studio,以后简称CS) 3.1的项目以后,开启Game1.cs的程序代码

rendering pipeline中,我们知到顶点的信息(包含positionnormaltexture coordniate),都是被储存在Vertex Buffer中,然后再送进Vertex Processing处理一些转换(包含将Local Coordniate转换到World Coordniate)

而我们第一步就是要建立Vertex Buffer!!

宣告一个变量Vertex Buffer:

VertexBuffer mVertexBuffer;

接下来宣告几项变量:

说明: 我们需要告知Pipeline现在我们的顶点包含哪些数据。(像是包含位置跟颜色等)

设定完变量以后,接下来就可以设定顶点的数据

在建构子当中,建立顶点信息,如下

mVertex = new VertexPositionColor[4];

mVertex[0].Position = new Vector3(-1, 1, 0);
mVertex[0].Color = Color.Blue;

mVertex[1].Position = new Vector3(-1, -1, 0);
mVertex[1].Color = Color.Red;

mVertex[2].Position = new Vector3(1, -1, 0);
mVertex[2].Color = Color.Orange;

mVertex[3].Position = new Vector3(1, 1, 0);
mVertex[3].Color = Color.MediumPurple;

这边我们宣告的四个顶点,VertexPositionColor.Position设定顶点位置,是一个三维的坐标。

VertexPositionColor.Color设定顶点颜色。

VertexPositionColor[] mVertex;
说明: 宣告顶点,而顶点结构的内容指包含位置和颜色。这边有多个选择顶点的结构,像是VertexPositionColorVertexPositionColorTextureVertexPositionNormalTextureVertexPositionTexture四种。

VertexPositionColor: 可以宣告顶点位置和顶点颜色。

VertexPositionColorTexture: 可以宣告顶点位置、颜色和贴图坐标。

VertexPositionNormalTexture: 可以宣告顶点位置、法像量和贴图坐标。

VertexPositionTexture: 可以宣告顶点位置和贴图坐标。

BasicEffect basicEffect;
说明: 使用基本的特效,包含一些打光和一些矩阵(View matrixprojection matrix)

设定完毕以后,在Initialize函数中,初始化一些变量和设定一些相关的矩阵。

mDeclaration = new VertexDeclaration(GraphicsDevice, VertexPositionColor.VertexElements);
说明: 告知Pipeline现在的顶点结构,第一个参数传入现在的GraphicsDevice,第二个参数传入结构的型态,在面所说的四个顶典型态都会有一个VertexElements的成员,将它设定为那个即可。

mVertexBuffer = new VertexBuffer(GraphicsDevice, VertexPositionColor.SizeInBytes * mVertex.Length, BufferUsage.None);
说明: 建立VertexBuffer,第一个参数为GraphicsDevice,第二个参数设定就是现在Vertex Buffer的大小(取得顶点结构的大小以后,在乘上顶点数量),第三个参数设定Buffer的存取模式。
mVertexBuffer.SetData<VertexPositionColor>(mVertex);
说明: 设定VertexBuffer的顶点数据。

Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 1), Vector3.Zero, Vector3.Up);
说明: 设定View matrix,第一个参数为Camera的位置,第二个参数为Camera观察的点,第三个参数为向上的方向,第三个参数用来告知,现在哪边为上方,如果设定错误,可能会看到不是预期想看到的结果。)
Matrix project = Matrix.CreateOrthographic(5, 5, 0, 1);
说明: 设定投影矩阵,这边使用平行投影。

basicEffect = new BasicEffect(GraphicsDevice, null);
说明: 建立一个BasicEffect的对象。
basicEffect.VertexColorEnabled = true;
说明: 开起顶点颜色
basicEffect.World = Matrix.Identity;
说明: 设定世界矩阵(包含旋转、平移、缩放,这些称为世界矩阵)
basicEffect.View = view;
说明: 设定视野矩阵(一般可能会看到一个词,叫做ModelView matrix,这是因为world matrix可以直接跟view matrix相乘,这结果是相同的)
basicEffect.Projection = project;
说明: 设定投影矩阵。

设定完以上参数以后,接下来我们就可以准备画出结果了

Draw的函数中,打入下面程序代码

GraphicsDevice.VertexDeclaration = mDeclaration;
说明: 设定顶点结构

GraphicsDevice.RenderState.PointSize = 10;
说明: 设定顶点的点大小。

GraphicsDevice.RenderState.CullMode = CullMode.None;
说明: 设定Culling Mode,在Rendering pipeline中,先剃除掉看不到的面,这边是指不开启Culling,因为每个人设定顶点的方式不同,像是顺时钟设定或是逆时钟设定等等(像这个范例我就是使用逆时钟设定顶点)XNA预设是顺时钟为front face,所以我用逆时钟的方式设定的话,是看不到结果的。

basicEffect.Begin();
basicEffect.CurrentTechnique.Passes[0].Begin();
GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleFan, mVertex, 0, 2);
说明: 将几何图形画出,第一个参数为设定几何模型的型态,像是点、线、三角形等,第二个参数为顶点的数据,第三个参数起始位置,第四个参数是说现在要画几个,第四个参数比较值得注意就是,你需要知道现在你要画几个,如果设定错误程序就会crush掉。
basicEffect.CurrentTechnique.Passes[0].End();
basicEffect.End();

执行结果如下

使用triangle fan建立的结果

使用Line list结果(GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.LineList, mVertex, 0, 2))

使用Line Strip结果(GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.LineStrip, mVertex, 0, 3))

上面三个结果请注意第四个参数。

最后跟大家补充一个填塞的方式,以第一张图片来说,我们可以看到明明就是指有设定四个顶点,为什么其它地方没有设定的他也会有颜色那些!?

原因是因为预设的参数中,填写模式(Fill mode)solid所以他会将颜色和点顶内插,当然我们也可以不指定。

只要打入一行指令即可
GraphicsDevice.RenderState.FillMode =
FillMode.Point;

FillMode一共有三个选择
1.


2.
网格


3.
填满

结果如下(使用triangle fan的连结方式)

网格

填满

使用VertexBuffer来绘制简单的几何形状的说明就到此结束..

这边各位可能会发现我没有使用到Index Buffer来建立。

没有使用Index buffer的坏处就是我需要大量的点顶来描述现在的3D对象,而那些顶点,很多都是有可能重复到的!!

1.42.6这两个点根本就是重复的点,如果我知道连接的方式是怎么样的话,那我就可以自己指定连结,就不会使用XNA预设的方式填写。而这就是Index Buffer的好处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值