DirectX中Mesh的子集

一个网格(Mesh)对象是由一个或多个子集(Subset)组成。每个子集中又由一系列三角形、一个属性表来组成,一系列三角形用于组成网格(Mesh)的一部分,属性表用于指定三角形的材质、贴图以及渲染状态等。每个子集指定一个唯一的非负整数来标识子集,如012等。前面已经用到了Mesh类的DrawSubset()方法来绘制一个指定的子集,通过Mesh类的NumberAttributes属性可以获得网格中属性表的数目,即子集的数目,所以在不清楚网格中子集数目的情况下下绘制子集,可以如下代码来绘制网格中所有的子集对象:

            for (int i = 0; i < meshObj.NumberAttributes; i++)

            {

                //绘制网格子集

                meshObj.DrawSubset(i);

            }

一个网格对象中可能包含多个子集,不同子集主要通过属性(AttributeID)来区别。

 

        private void DeclareMultiSubsets()

        {

            int numberVerts = 8;

            short[] indices = {

                        0,1,2, // 前面

                        1,3,2, // 前面 

                        4,5,6, // 后面 

                        6,5,7, // 后面

                        0,5,4, // 顶面

                        0,2,5, // 顶面

 

                        1,6,7, // 底面 

                        1,7,3, // 底面 

                        0,6,1, // 左面 

                        4,6,0, // 左面

                        2,3,7, // 右面 

                        5,2,7  // 右面

                    };

            //创建网格对象

            meshObj = new Mesh(indices.Length / 3, numberVerts, MeshFlags.Managed,

                CustomVertex.PositionColored.Format, device);

            //设置顶点缓冲数据

            using (VertexBuffer vb = meshObj.VertexBuffer)

            {

                GraphicsStream data = vb.Lock(0, 0, LockFlags.None);

                data.Write(new CustomVertex.PositionColored(-1.0f, 1.0f, 1.0f, 0x00ff00ff));

                data.Write(new CustomVertex.PositionColored(-1.0f, -1.0f, 1.0f, 0x00ffff00));

                data.Write(new CustomVertex.PositionColored(1.0f, 1.0f, 1.0f, 0x0000ffff));

                data.Write(new CustomVertex.PositionColored(1.0f, -1.0f, 1.0f, 0x00ff0000));

                data.Write(new CustomVertex.PositionColored(-1.0f, 1.0f, -1.0f, 0x000000ff));

                data.Write(new CustomVertex.PositionColored(1.0f, 1.0f, -1.0f, 0x0000ff00));

                data.Write(new CustomVertex.PositionColored(-1.0f, -1.0f, -1.0f, 0x00ffffff));

                data.Write(new CustomVertex.PositionColored(1.0f, -1.0f, -1.0f, 0x00000000));

                vb.Unlock();

            }

            //设置缓冲

            using (IndexBuffer ib = meshObj.IndexBuffer)

            {

                ib.SetData(indices, 0, LockFlags.None);

            }

            //设置缓冲数据属性,为每个面设置属性

            int[] attribBuffer = meshObj.LockAttributeBufferArray(LockFlags.None);

            //设定前6个面的属性为0

            for (int i = 0; i < 6; i++)

            {

                attribBuffer[i] = 0;

            }

            //设定后6个面的属性为1

            for (int i = 0; i < 6; i++)

            {

                attribBuffer[i + 6] = 1;

            }

            // 解锁属性缓冲

            meshObj.UnlockAttributeBuffer(attribBuffer);

            // 创建属性

            AttributeRange subset1 = new AttributeRange();

            subset1.AttributeId = 0;

            subset1.FaceStart = 0;

            subset1.FaceCount = 6;

            subset1.VertexCount = 36;

            subset1.VertexStart = 0;

            AttributeRange subset2 = new AttributeRange();

            subset2.AttributeId = 1;

            subset2.FaceStart = 6;

            subset2.FaceCount = 6;

            subset2.VertexCount = 36;

            subset2.VertexStart = 0;

            meshObj.SetAttributeTable(new AttributeRange[]{subset1,subset2});

        }

如果要显示前面、后面和顶面,则在渲染函数中绘制第一个属性,如下代码:

meshObj.DrawSubset(0);

若要显示左面、右面和底面,则在渲染函数中绘制第二个属性,如下代码:

meshObj.DrawSubset(1);

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值