D3D描绘四边形的四种方法之DrawPrimitive、DrawIndexedPrimitive、DrawPrimitiveUP、DrawIndexedPrimitiveUP
创建描绘四边形的四种方法:(程序片段,只是简要介绍不同之处,不对之处,恳请指正)
第一种:最常用的一种:
使用D3D坐标(D3DFVF_XYZ ),通过设置矩阵,使用VB, 4个点。调用DrawPrimitive();
使用6个顶点时也可以,在render时需要使用
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );
LPDIRECT3D9 g_pD3D = NULL;// Used to create the D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold Vertices'
LPDIRECT3DINDEXBUFFER9 g_pIB = NULL;
VOID* pVertices;
struct CUSTOMVERTEX
{
FLOAT x, y, z;
DWORD color;
};
CUSTOMVERTEX Vertices[] =
{
{ -1.0f, -1.0f, 1.f, 0xffff0000, },//左下
{ -1.0f, 1.0f, 1.f, 0xff00ff00, },//左上
{ 1.0f, -1.0f, 1.f, 0xff00ff00, },//右下
{ 1.0f, 1.0f, 1.f, 0xff00ff00, },//右上
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
HRESULT InitVB()
{
HRESULT hr = E_FAIL;
do
{
hr = g_pd3dDevice->CreateVetexBuffer( 4 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) ;
If(E_FAIL == hr)
{ Break; }
hr = g_pVB->Lock( 0, sizeof( Vertices ), ( void** )&pVertices, 0 )
If(E_FAIL == hr)
{ Break; }
memcpy( pVertices, Vertices, sizeof( Vertices ) );
g_pVB->Unlock();
// create index buffer
#if 0
int fIB[] = {0,1,2,2,1,3,};
if (FAILED(g_pd3dDevice->CreateIndexBuffer( sizeof(fIB), D3DUSAGE_DYNAMIC, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &g_pIB, NULL)))
{ return E_FAIL; }
void *pIndexs;
if (FAILED(g_pIB->Lock(0, sizeof(fIB),&pIndexs,D3DLOCK_DISCARD)))
{ return E_FAIL; }
memcpy(pIndexs, fIB, sizeof(fIB)); g_pIB->Unlock();
#endif
}while(false)
return hr;
}
//set world view project matrix.
VOID SetupMatrices()
{ D3DXMATRIXA16 matWorld;
// Set up the rotation matrix to generate 1 full rotation (2*PI radians)
// every 1000 ms. To avoid the loss of precision inherent in very high
// floating point numbers, the system time is modulated by the rotation
// period before conversion to a radian angle.
UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * ( 2.0f * D3DX_PI ) / 1000.0f;
D3DXMatrixRotationX( &matWorld, fAngle );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
D3DXVECTOR3 vEyePt( 0.0f, 0.0f, -5.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI / 4, 1.778f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj ); }
//render
VOID Render()
{
//USE VB,don't use IB.
//use D3DFVF_XYZ FVF,it’s should call SetupMatrices() SetupMatrices();
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ));
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
#if 0 // use VB and IB.
SetupMatrices();
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ));
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->SetIndices(g_pIB);
g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0,4,0,2 );
#endif
}
第二种:使用顶点缓冲区和索引缓冲区,且使用DrawIndexedPrimitive()。
第三种:使用屏幕坐标,D3DFVF_XYZRHW,而不使用D3DFVF_XYZ。这个时候不需要使用顶点缓冲区和索引缓冲区。
在render的时候,不需要设置world、view、project矩阵。调用DrawPrimitiveUP()。
struct CUSTOMVERTEX_RHW
{
FLOAT x, y, z, rhw; // The transformed position for the vertex
DWORD color; // The vertex color }; // Initialize three Vertices for rendering a triangle
CUSTOMVERTEX_RHW Verticesrhw[] =
{
{ 50.0f, 150.0f, 0.5f, 1.0f, 0xff00ffff, },
{ 50.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, },
{ 150.0f, 150.0f, 0.5f, 1.0f, 0xff00ffff, },
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xff00ff00, },
};
Void render()
{
//SetupMatrices();
//g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ));
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX_RHW);
//g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
//g_pd3dDevice->SetIndices(g_pIB);
//g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0,4,0,2 );
g_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, (void*)Verticesrhw, sizeof(CUSTOMVERTEX_RHW)); }
第四种:使用屏幕坐标,D3DFVF_XYZRHW,而不使用D3DFVF_XYZ。这个时候不需要使用顶点缓冲区和索引缓冲区。
在render的时候,不需要设置world、view、project矩阵。调用DrawIndexedPrimitiveUP()。
与第三种方法相比,只是多了一个顶点索引设置。
int fIB[] = {0,1,2,2,1,3,};
Void render()
{
//SetupMatrices();
//g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ));
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX_RHW);
//g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
//g_pd3dDevice->SetIndices(g_pIB);
//g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0,4,0,2 );
g_pd3dDevice->DrawIndexedPrimitiveUP( D3DPT_TRIANGLELIST, 0, 4, 2, (void*)fIB, D3DFMT_INDEX32, (void*)Verticesrhw, sizeof(CUSTOMVERTEX_RHW));
}
D3D描绘四边形的四种方法之DrawPrimitive、DrawIndexedPrimitive、DrawPrimitiveUP、DrawIndexedPrimitiveUP相关推荐
- java 中lock,java中lock获取锁的四种方法
在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...
- 简单介绍C语言使用四种方法初始化结构体
这篇文章说明了什么是结构体,介绍了结构体的概念和使用优点,在C语言中如何使用和初始化结构体方法,通过详细的代码展开进行说明,希望该篇文章对你有所帮助 什么是结构体 在实际问题中,一组数据往往有很多种不 ...
- svg鼠标响应事件的四种方法(其中两种可支持火狐)
svg鼠标响应事件的四种方法 鼠标响应事件的四种方法,以click事件为例. Mouse Events - SMIL <?xml version="1.0" encoding ...
- oracle调整字段精度的四种方法
oracle调整字段精度的四种方法: 01_执行用户_ddl/dml_表名_注释(建表/授权/同义词) 调整方式一:(精度只能调大不能调小) alter table table_name_a MODI ...
- (转).NET导出Excel的四种方法及评测
.NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...
- 详解Java解析XML的四种方法
http://developer.51cto.com 2009-03-31 13:12 cnlw1985 javaeye 我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...
- linux安装IPython四种方法
IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib.之后按下Tab键,IPytho ...
- 查看mysql版本的四种方法
2019独角兽企业重金招聘Python工程师标准>>> 查看mysql版本的四种方法 1:在终端下:mysql -V. 以下是代码片段: [shengting@login ~]$ m ...
- linux下配置ip地址四种方法(图文)
配置ip地址四种方法 (1)Ifconfig命令 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:o ...
最新文章
- php 查oracle 表不存在报错处理,Oracle ORA-08104报错处理方法及注意事项
- leetcode算法题--最多的不重叠子字符串★★
- 各个会议期刊论文录取情况
- JS 装饰器(Decorator)场景实战
- 1910101811
- 淘宝H5移动端解决方案
- server xcode 云服务器_SRT推流测试及服务器搭建
- java 斗地主 案例
- 数据库:数据导入/数据导出
- 图像定位的优化、评价和应用简介
- [转载] python函数分为哪几种_python常用函数
- 开源项目SmartImageView的引用
- 初中中考计算机考试,中考信息技术考试
- matlab量化股票基本面,获取数据 - MATLAB - 掘金量化
- 第三十三章 SQL命令 DROP INDEX
- linux服务上实现web在线编辑,利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中 | Linux 中国...
- Outline for Mac(Mac记事本软件)
- 含泪整理 计算机网络详细八股文(第一部分)
- /etc/profile 和 /etc/profile.d/ 的区别
- 2016奇虎360校园招聘编程题目