3D游戏从入门到精通-12

 
1、             使用索引缓冲区
什么是索引缓冲区呢?其实索引缓冲区,就像指针一样的工具。顶点缓冲区里保存的是真实的顶点,而索引缓冲区只记录顶点缓冲区的顶点编号。比如顶点缓冲区里有4个顶点,而这4个顶点就可以构成两个三角形来显示。如果直接使用顶点缓冲区的话,就需要写6个顶点。这样就可以使用索引缓冲区,指明第一个三角形是由顶点编号1、2、3构成一个三角形,而第二个三角形就是1、3、4组成。
现在把上面的立方体改为使用索引缓冲区,先创建8个顶点,如下:
pVertices[0].vPosition = D3DXVECTOR3(    -1.0f, -1.0f, -1.0f ); 
pVertices[1].vPosition = D3DXVECTOR3(    -1.0f, 1.0f, -1.0f );   
pVertices[2].vPosition = D3DXVECTOR3(    1.0f, 1.0f, -1.0f );    
pVertices[3].vPosition = D3DXVECTOR3(    1.0f, -1.0f, -1.0f );   
 
pVertices[4].vPosition = D3DXVECTOR3(    -1.0f, 1.0f, 1.0f );    
pVertices[5].vPosition = D3DXVECTOR3(    1.0f, 1.0f, 1.0f );
pVertices[6].vPosition = D3DXVECTOR3(    1.0f, -1.0f, 1.0f );    
pVertices[7].vPosition = D3DXVECTOR3(    -1.0f, -1.0f, 1.0f );
这样,就可省下许多顶点占用的内存了,然后创建36个索引点的缓冲区,如下:
 
//创建索引缓冲区。
 hr = m_pd3dDevice->CreateIndexBuffer( 12*3 *sizeof(WORD),
       0, D3DFMT_INDEX16, D3DPOOL_DEFAULT,
       &m_pIB, NULL );
 
 if( FAILED( hr ) )
 {
       return E_FAIL;
 }   
 
上面创建了36个WORD大小的索引点,这样省了很多内存空间。由于顶点是由3个浮点数和其它值组成,肯定比两个字节索引值占用空间大。接着下来就是设置索引缓冲区,如下:
 
void* pIndices;
 
 if( FAILED( m_pIB->Lock( 0, sizeof(WORD)*12*3, &pIndices,0 ) ) )          
 {
       m_pIB->Release();
       m_pIB = NULL;
       return E_FAIL;
 }
 
 //
 WORD* pIndex = reinterpret_cast<WORD*>(pIndices);
 int nPos = 0;
 
 //1
 pIndex[nPos++] = 0;
 pIndex[nPos++] = 1;
 pIndex[nPos++] = 2;
 
 pIndex[nPos++] = 0;
 pIndex[nPos++] = 2;
 pIndex[nPos++] = 3;
 
 
 //2
 pIndex[nPos++] = 1;
 pIndex[nPos++] = 4;
 pIndex[nPos++] = 2;
 
 pIndex[nPos++] = 2;
 pIndex[nPos++] = 4;
 pIndex[nPos++] = 5;
 
 //3
 pIndex[nPos++] = 2;
 pIndex[nPos++] = 5;
 pIndex[nPos++] = 3;
 
 pIndex[nPos++] = 3;
 pIndex[nPos++] = 5;
 pIndex[nPos++] = 6;
 
 //4
 pIndex[nPos++] = 0;
 pIndex[nPos++] = 7;
 pIndex[nPos++] = 1;
 
 pIndex[nPos++] = 1;
 pIndex[nPos++] = 7;
 pIndex[nPos++] = 4;
 
 //5
 pIndex[nPos++] = 0;
 pIndex[nPos++] = 3;
 pIndex[nPos++] = 7;
 
 pIndex[nPos++] = 3;
 pIndex[nPos++] = 6;
 pIndex[nPos++] = 7;
 
 
 //6
 pIndex[nPos++] = 4;
 pIndex[nPos++] = 7;
 pIndex[nPos++] = 5;
 
 pIndex[nPos++] = 5;
 pIndex[nPos++] = 7;
 pIndex[nPos++] = 6;
 //
 m_pIB->Unlock();
 
上面这段代码,先Lock函数取得索引缓冲区地址,然后依次设置索引值,这里使用三角形列表,所以顶点顺序一样是按顺时针方向来设置的,也就是按左手坐标系来设置的。
接着下来,就需要渲染这个立方体了,如下:
m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(VT_CAICUBE) );
 m_pd3dDevice->SetFVF( VT_CAICUBE::dwFVF );
 
m_pd3dDevice->SetIndices(m_pIB);
m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);
上面代码先设置了8个顶点缓冲区到管道里,然后再调用SetIndices设置索引缓冲区,最后调用DrawIndexedPrimitive函数来显示所有三角形列表。DrawIndexedPrimitive函数的第一个参数是索引列表里的类型,第二个参数是索引缓冲区在顶点缓冲区里的起始位置,比如顶点缓区是0,1,3的,当设置这个值为50时,那么相当于访问了50,51,53的顶点值。第三个参数是最小索引值。第四个参数是有多少个顶点会使用。第五个参数是从那个索引值开始。第六个参数是基本图形个数。
 
通过这样学习,就学会使用了索引缓冲区,如果有很多顶点,有很多三角形,就需要使用优化的算法,以便有最少的顶点,使用最多的索引,这样有利于减少内存占用,提高带宽利用,提高显示卡显示更多图形,提高游戏的性能。
 
  
 
电子书 MM3D 引擎源程序 例子源程序 49 元一套
联系人:蔡军生  
联系方式:
QQ: 9073204
EMAIL: caimouse1976 at sina.com
 
  

转载于:https://www.cnblogs.com/ajuanabc/archive/2006/08/17/2464437.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
毕业设计,基于SpringBoot+Vue+MySQL开发的社区医院管理系统,源码+数据库+毕业论文+视频演示 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的社区医院管理系统实现了病例信息、字典表、家庭医生、健康档案、就诊信息、前台、药品、用户、用户、用户表等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让社区医院管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。 关键字:社区医院管理系统;信息管理,时效性,安全性,MySql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值