创建描绘四边形的四种方法:(程序片段,只是简要介绍不同之处,不对之处,恳请指正)

第一种:最常用的一种:

使用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相关推荐

  1. java 中lock,java中lock获取锁的四种方法

    在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...

  2. 简单介绍C语言使用四种方法初始化结构体

    这篇文章说明了什么是结构体,介绍了结构体的概念和使用优点,在C语言中如何使用和初始化结构体方法,通过详细的代码展开进行说明,希望该篇文章对你有所帮助 什么是结构体 在实际问题中,一组数据往往有很多种不 ...

  3. svg鼠标响应事件的四种方法(其中两种可支持火狐)

    svg鼠标响应事件的四种方法 鼠标响应事件的四种方法,以click事件为例. Mouse Events - SMIL <?xml version="1.0" encoding ...

  4. oracle调整字段精度的四种方法

    oracle调整字段精度的四种方法: 01_执行用户_ddl/dml_表名_注释(建表/授权/同义词) 调整方式一:(精度只能调大不能调小) alter table table_name_a MODI ...

  5. (转).NET导出Excel的四种方法及评测

    .NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...

  6. 详解Java解析XML的四种方法

    http://developer.51cto.com  2009-03-31 13:12  cnlw1985  javaeye  我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...

  7. linux安装IPython四种方法

    IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib.之后按下Tab键,IPytho ...

  8. 查看mysql版本的四种方法

    2019独角兽企业重金招聘Python工程师标准>>> 查看mysql版本的四种方法 1:在终端下:mysql -V. 以下是代码片段: [shengting@login ~]$ m ...

  9. linux下配置ip地址四种方法(图文)

    配置ip地址四种方法 (1)Ifconfig命令 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:o ...

最新文章

  1. php 查oracle 表不存在报错处理,Oracle ORA-08104报错处理方法及注意事项
  2. leetcode算法题--最多的不重叠子字符串★★
  3. 各个会议期刊论文录取情况
  4. JS 装饰器(Decorator)场景实战
  5. 1910101811
  6. 淘宝H5移动端解决方案
  7. server xcode 云服务器_SRT推流测试及服务器搭建
  8. java 斗地主 案例
  9. 数据库:数据导入/数据导出
  10. 图像定位的优化、评价和应用简介
  11. [转载] python函数分为哪几种_python常用函数
  12. 开源项目SmartImageView的引用
  13. 初中中考计算机考试,中考信息技术考试
  14. matlab量化股票基本面,获取数据 - MATLAB - 掘金量化
  15. 第三十三章 SQL命令 DROP INDEX
  16. linux服务上实现web在线编辑,利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中 | Linux 中国...
  17. Outline for Mac(Mac记事本软件)
  18. 含泪整理 计算机网络详细八股文(第一部分)
  19. /etc/profile 和 /etc/profile.d/ 的区别
  20. 2016奇虎360校园招聘编程题目

热门文章

  1. 灵魂9问,光怪陆离的网络世界有哪些不为人知的秘密?(网络面试必考)
  2. CentOS 8系统启用BBR加速
  3. php 判断数组值为空,PHP判断数组是否为空的五种常用方法
  4. C#分页的总页数算法
  5. JavaFX实现三个风扇、每个风扇有按钮控制、一个总按钮控制三个风扇
  6. antlr4 mysql,antlr4 sql语法
  7. Ionic实现混合开发--探索之旅
  8. Mac App Store下载总是发生错误如何解决?
  9. 计算机组成原理课程作业,兰大网院17春计算机组成原理课程作业 C.doc
  10. 【数据库系统01】强制存取控制