[Slimdx]顶点和索引缓冲,绘制了2个分离的三角形

定义网格顶点和索引缓冲,绘制了2个分离的三角形。

  1 using System;
  2 using System.Drawing;
  3 using RGeos.SlimScene.Core;
  4 using SlimDX;
  5 using SlimDX.Direct3D9;
  6 using CustomVertex;
  7 using RGeos.AppScene.Renderable;
  8
  9 namespace RGeos.SlimScene.Renderable
 10 {
 11     /// <summary>
 12     /// 定义网格顶点和索引缓冲
 13     /// </summary>
 14     public class BoxMesh : RenderableObject
 15     {
 16         private CustomVertex.PositionColored[] vertices;//定义网格顶点
 17         private short[] indices;//定义网格中三角形索引
 18         private int modelVertCount = 0;
 19         private int modelFaceCount = 0;
 20         private VertexBuffer vertBuffer;
 21         private IndexBuffer indBuffer;
 22
 23         public BoxMesh(string name)
 24             : base(name)
 25         {
 26             this.isSelectable = true;
 27         }
 28         private void ComputeVertexs()
 29         {
 30             vertices = new CustomVertex.PositionColored[6];
 31
 32             Vector3 pt = new Vector3();
 33             pt.X = 0;
 34             pt.Y = 0;
 35             pt.Z = 0;
 36             vertices[0].Position = pt;
 37             vertices[0].Color = Color.Red.ToArgb();
 38
 39             Vector3 pt1 = new Vector3();
 40             pt1.X = 0;
 41             pt1.Y = 10;
 42             pt1.Z = 0;
 43             vertices[1].Position = pt1;
 44             vertices[1].Color = Color.Red.ToArgb();
 45
 46             Vector3 pt2 = new Vector3();
 47             pt2.X = 0;
 48             pt2.Y = 10;
 49             pt2.Z = 10;
 50             vertices[2].Position = pt2;
 51             vertices[2].Color = Color.Red.ToArgb();
 52
 53             Vector3 pt3 = new Vector3();
 54             pt3.X = 0;
 55             pt3.Y = 20;
 56             pt3.Z = 20;
 57             vertices[3].Position = pt3;
 58             vertices[3].Color = Color.Blue.ToArgb();
 59
 60             Vector3 pt4 = new Vector3();
 61             pt4.X = 0;
 62             pt4.Y = 20;
 63             pt4.Z = 0;
 64             vertices[4].Position = pt4;
 65             vertices[4].Color = Color.Blue.ToArgb();
 66
 67             Vector3 pt5 = new Vector3();
 68             pt5.X = 20;
 69             pt5.Y = 0;
 70             pt5.Z = 0;
 71             vertices[5].Position = pt5;
 72             vertices[5].Color = Color.Blue.ToArgb();
 73         }
 74
 75         /// <summary>
 76         /// 计算索引
 77         /// </summary>
 78         private void ComputeIndices()
 79         {
 80             indices = new short[6];
 81
 82             indices[0] = 0;
 83             indices[1] = 1;
 84             indices[2] = 2;
 85             indices[3] = 3;
 86             indices[4] = 4;
 87             indices[5] = 5;
 88
 89         }
 90
 91         #region Renderable
 92         /// <summary>
 93         /// 初始化对象
 94         /// </summary>
 95         /// <param name="drawArgs">渲染参数</param>
 96         public override void Initialize(DrawArgs drawArgs)
 97         {
 98             LoadTexturesAndMaterials(drawArgs);//导入贴图和材质
 99             ComputeVertexs();//计算顶点
100             ComputeIndices();//计算索引
101
102             vertBuffer = BufferCreator.CreateVertexBuffer(drawArgs.Device, vertices);
103             indBuffer = BufferCreator.CreateIndexBuffer(drawArgs.Device, indices);
104             modelVertCount = vertices.Length;
105             modelFaceCount = indices.Length / 3;
106             this.isInitialized = true;
107         }
108
109
110         /// <summary>
111         /// 渲染对象
112         /// </summary>
113         /// <param name="drawArgs">渲染参数</param>
114         public override void Render(DrawArgs drawArgs)
115         {
116             if (!this.IsOn || !this.isInitialized) return;
117             //获取当前世界变换
118             Matrix world = drawArgs.Device.GetTransform(TransformState.World);
119             //获取当前顶点格式
120             VertexFormat format = drawArgs.Device.VertexFormat;
121             //获取当前的Z缓冲方式
122             int zEnable = drawArgs.Device.GetRenderState(RenderState.ZEnable);
123             //获取纹理状态
124             int colorOper = drawArgs.Device.GetTextureStageState(0, TextureStage.ColorOperation);
125
126             try
127             {
128                 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Modulate);
129                 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
130                 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorArg2, TextureArgument.Diffuse);
131                 drawArgs.Device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Disable);
132
133                 //设置顶点格式
134                 drawArgs.Device.VertexFormat = CustomVertex.PositionColored.Format;
135                 //设置Z缓冲
136                 drawArgs.Device.SetRenderState(RenderState.ZEnable, 1);
137                 //设置纹理状态,此处使用纹理
138                 //drawArgs.Device.SetTexture(0, texture);//设置贴图
139                 drawArgs.Device.SetStreamSource(0, vertBuffer, 0, PositionColored.SizeBytes);
140                 drawArgs.Device.Indices = indBuffer;
141                 drawArgs.Device.VertexFormat = PositionColored.Format;
142                 drawArgs.Device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, modelVertCount, 0, modelFaceCount);
143             }
144             catch (Exception e)
145             {
146                 Utility.Log.Write(e);
147             }
148             finally
149             {
150                 drawArgs.Device.SetTransform(TransformState.World, world);
151                 drawArgs.Device.VertexFormat = format;
152                 drawArgs.Device.SetRenderState(RenderState.ZEnable, zEnable);
153                 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, colorOper);
154             }
155             if (disposing)
156             {
157                 Dispose();
158                 disposing = false;
159             }
160         }
161         public bool disposing = false;
162         /// <summary>
163         /// 更新对象
164         /// </summary>
165         /// <param name="drawArgs">渲染参数</param>
166         public override void Update(DrawArgs drawArgs)
167         {
168             if (!this.isInitialized)
169             {
170                 this.Initialize(drawArgs);
171             }
172         }
173
174         /// <summary>
175         /// 执行选择操作
176         /// </summary>
177         /// <param name="X">点选X坐标</param>
178         /// <param name="Y">点选Y坐标</param>
179         /// <param name="drawArgs">渲染参数</param>
180         /// <returns>选择返回True,否则返回False</returns>
181         public bool PerformSelectionAction(int X, int Y, DrawArgs drawArgs)
182         {
183             return false;
184         }
185
186
187         /// <summary>
188         /// 释放对象
189         /// </summary>
190         public override void Dispose()
191         {
192             this.isInitialized = false;
193             //base.Dispose();
194         }
195         #endregion
196
197         private void LoadTexturesAndMaterials(DrawArgs drawArgs)//导入贴图和材质
198         {
199
200         }
201
202
203         public override bool PerformSelectionAction(DrawArgs drawArgs)
204         {
205             bool flag = PerformSelectionAction(DrawArgs.LastMousePosition.X, DrawArgs.LastMousePosition.Y, drawArgs);
206             return flag;
207         }
208
209     }
210 }

顶点缓冲创建方法:

1  public static VertexBuffer CreateVertexBuffer(Device device, PositionColored[] vertices)
2         {
3             VertexBuffer vertexBuffer = new VertexBuffer(device, vertices.Length * CustomVertex.PositionColored.SizeBytes, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
4             DataStream vs = vertexBuffer.Lock(0, vertices.Length * CustomVertex.PositionColored.SizeBytes, LockFlags.None);
5             vs.WriteRange(vertices);
6             vertexBuffer.Unlock();
7             vs.Dispose();
8             return vertexBuffer;
9         }

CreateVertexBuffer

索引的:

1  public static IndexBuffer CreateIndexBuffer(Device device, short[] indicesData)
2         {
3             IndexBuffer indexBuffer = new IndexBuffer(device, 16 * indicesData.Length, Usage.WriteOnly, Pool.Default, true);
4             DataStream ds = indexBuffer.Lock(0, 16 * indicesData.Length, LockFlags.None);
5             ds.WriteRange(indicesData);
6             indexBuffer.Unlock();
7             ds.Dispose();
8             return indexBuffer;
9         }

CreateIndexBuffer

效果图:

时间: 2024-10-08 16:45:11

[Slimdx]顶点和索引缓冲,绘制了2个分离的三角形的相关文章

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——Direct3D中的顶点缓存和索引缓存

第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物体模型的基本单元,而一个三角形有3个顶点,为了能够使用大量三角形组成三角形网格来描述物体,需要首先定义号三角形的顶点(Vertex),3个顶点确定一个三角形,顶点除了定义每个顶点的坐标位置外,还还含有颜色等其他属性. 在Direct3D中,顶点的具体表现形式是顶点缓存,顶点缓存保存了顶点数据的内存空

【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法

Stage3D在运行中是存在随时会丢失上下文的尴尬情况. 渲染内容丢失的问题本身就说明是因为丢失了Context3D对象.出现此问题的原因很多,通常还不是因为Stage3D应用.比如在win7系统中,当按下Ctrl+Alt+Delete键时会出现类似“锁定计算机”和“启动任务管理器”的菜单选项,这就会引起渲染内容丢失.但这不是唯一的可能,还有些情况,在某些屏保程序激活时又或笔记本盖子合上时也会引起渲染内容丢失.甚至可以通过调用Context3D.dispose()方法来模拟渲染内容丢失事件.所以

Axiom3D:Ogre中Mesh网格分解成点线面。

这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分析Mesh里的VertexData与IndexData,分析顶点时查找源码发现Ogre里本身有相关的类,这里Axiom3D与Ogre的源码有些区别,不过大致意思相同. 主要用到的类:EdgeListBuilder,CommonVertexList,EdgeData. 流程很简单,EdgeListBu

DirectX11 学习笔记6 - 使用D3DXMATH数学库的一个例子

这个例子是在之前的例子基础上 ,把之前d3dx10math数学库换成了最新的d3dxmath.优点就不说了.先上效果图 全部代码.以及效果文件 文件结构 全部代码: 按照上图的文件顺序 #pragma once #include <D3DX10math.h> #include <xnamath.h> class XCamera { public: XCamera() { m_positionX = 0.0f; m_positionY = 0.0f; m_positionZ = 0.

【Directx12】资源绑定

D3D12中涉及资源绑定的关键部分是描述符(descriptor),描述符表(desciptor table),描述堆(descriptor heap)和根签名(root signature). 资源和图形管线 Shader资源(诸如贴图,常量表,图片,缓冲等等)并非是直接绑定在shader管线上,而是通过描述符(descriptor)知名的.一个描述符包含一个资源的所有信息. 描述符会组合到一起形成描述符表(descriptor table).每个描述符表储存某一(多)类型的资源信息.常见的资

Android面试收集录 OpenGL ES

1.如何用OpenGL ES绘制一个三角形? 编写一个类实现Renderer接口,实现onDrawFrame方法,onSurfaceChanged方法,onSurfaceCreated方法 编写一个类Triangle类,定义定点坐标,装载所有顶点坐标,调用GL10的一个glDrawArrays方法来绘制三角形 最后在重写的onDrawFrame方法中调用triangle.drawSelf来真正绘制三角形 2.OpenGL ES绘制一个矩形有哪些方法? 三角形旋转法(但是要求一个角为90度) 顶点

Opengl_8_索引绘制

1,glDrawArrays顺序绘制,从指定偏移量依次扫描顶点缓冲区所有图元的每一个顶点.缺点是若一个是多个图元的共同顶点那么这个顶点就会在缓冲区出现多次.通过索引绘制类的函数,除顶点缓冲器(Vertices[])外额外还有一个索引缓冲(Indices[]),Indices存储着Vertices中顶点的索引值.Indices中重复顶点在顶点缓冲中的索引,不需要在Vertices中多次存储. 2,顶点缓冲使用的GL_ARRAY_BUFFER参数表示缓冲的类型,而索引缓冲类型使用的是GL_ELEME

Direct-X学习笔记--顶点&amp;基本图形绘制

DirectX描述物体使用三角形单元,构成三角形的最基本单位是顶点. DirectX中顶点格式是很灵活的,即我们可以自己定义顶点所包含的信息.除了坐标之外,我们还需要定义其他附加属性,颜色属性,法线属性等等. 我们在定义的时候,首先要使用DX的一个宏声明一下我们所定义的顶点包含哪些属性. //------------绘制图形步骤1.定义灵活顶点格式 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)//坐标为经过变换的屏幕坐标,顶

WebGL入门教程(二)-webgl绘制三角形

前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用webgl画出一个三角形. 效果图: 在WebGL入门教程(一)-初识webgl中,知道如何绘制一个点 //绘制一个点 gl.drawArrays(gl.POINTS, 0, 1); 但是图形是有多个点组成,那么就应该考虑如何绘制多个点,WebGL提供了一种很方便的机制,缓冲区对象(buffer obje