zoukankan      html  css  js  c++  java
  • [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 }
    View Code

    顶点缓冲创建方法:

    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

    效果图:

  • 相关阅读:
    windows server 2008 R2 安装 sql server 2000 遇到的种种问题
    圆心的VPS记录信息
    无法访问.您可能没有权限使用网络资源.局域网无法访问共享,局域网无法访问打印机的一些方法
    win7 32位 fastcgi模式 运行php
    SpringBoot+JPA实例
    马斯洛的锤子论
    一道算法题
    MySQL源码解读之数据结构LF_HASH
    JS学习专辑外传(1)
    WPF 用DynamicResource动态样式切换
  • 原文地址:https://www.cnblogs.com/yhlx125/p/4399039.html
Copyright © 2011-2022 走看看