12 ----------------------- Page 13----------------------- //----------------------------------------------------------------------------- // Desc:创建顶点缓冲区和索引缓冲区 //----------------------------------------------------------------------------- HRESULTInitVBAndIB() { //顶点数据 CUSTOMVERTEXg_Vertices[9]; g_Vertices[0].x= 300; g_Vertices[0].y= 250; g_Vertices[0].z= 0.5f; g_Vertices[0].rhw=1.0f; g_Vertices[0].color= 0xffff0000; for(inti=0; i<8;i++) { g_Vertices[i+1].x= (float)(200*sin(i*3.14159/4.0))+ 300; g_Vertices[i+1].y=-(float)(200*cos(i*3.14159/4.0))+ 250; g_Vertices[i+1].z=0.5f; g_Vertices[i+1].rhw= 1.0f; g_Vertices[i+1].color= 0xff00ff00; } //顶点索引数组 WORDg_Indices[]={ 0,1,2,0,2,3,0,3,4,0,4,5,0,5,6,0,6,7,0,7,8,0,8,1}; ================================================================= 创建索引缓冲 UINT Length, //索引缓冲区大小,按字节数计算 DWORD Usage, //索引缓冲区属性,和顶点缓冲区相同 D3DFORMAT Format, //索引数组的元素格式,可以使16位或者32位 D3DPOOL Pool, //索引缓冲区内存位置 IDirect3DIndexBuffer9** ppIndexBuffer, //索引缓冲区指针地址 HANDLE* pSharedHandle //保留参数,设为0 * //创建顶点缓冲区 if(FAILED(g_pd3dDevice->CreateVertexBuffer(9*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,&g_pVB,NULL) )) { 13 ----------------------- Page 14----------------------- returnE_FAIL; } //创建索引缓冲区 if( FAILED(g_pd3dDevice->CreateIndexBuffer(24*sizeof(WORD), 0, D3DFMT_INDEX16, //索引类型 D3DPOOL_DEFAULT,&g_pIB,NULL) )) { returnE_FAIL; } 保存顶点索引值 //填充顶点缓冲区 VOID*pVertices; if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices),(void**)&pVertices,0) ) ) returnE_FAIL; memcpy(pVertices,g_Vertices,sizeof(g_Vertices)); g_pVB->Unlock(); //填充索引缓冲区 VOID*pIndices; if(FAILED(g_pIB->Lock(0, sizeof(g_Indices),(void**)&pIndices,0 )) ) returnE_FAIL; memcpy(pIndices,g_Indices,sizeof(g_Indices)); g_pIB->Unlock(); 图形绘制 IDirect3DIndexBuffer9 *pIndexData //使用的索引缓冲区指针 HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, //基本图元类型 INT BaseVertexIndex, //顶点缓冲区的起始位置 UINT MinIndex, //相对于BaseVertexIndex的最小索引 UINT NumVertices, //绘制的顶点数目,第一个顶点的位置 UINT StartIndex, //索引缓冲区的起始位置 14 ----------------------- Page 15----------------------- UINT PrimitiveCount //绘制的基本图元数量 //----------------------------------------------------------------------------- // Desc:渲染图形 //----------------------------------------------------------------------------- VOIDRender() { //清空后台缓冲区 g_pd3dDevice->Clear(0, NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0 ); //开始在后台缓冲区绘制图形 if( SUCCEEDED(g_pd3dDevice->BeginScene())) { //在后台缓冲区绘制图形 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,9,0,8); //结束在后台缓冲区渲染图形 g_pd3dDevice->EndScene(); } //将在后台缓冲区绘制的图形提交到前台缓冲区显示 g_pd3dDevice->Present(NULL,NULL,NULL,NULL); } D3D D3D D3DXVECTOR3 * 1.通过“==”来判断向量是否相等,具体如下: D3DXVECTOR3 v(0.0F,1.0F,0.0F); If(u==v)return true; If(u!=v)return false; 2.判断浮点时应该定义一个“EPSILON”变量,如果两个浮点之间的差距小于 EPSILON就认为两个浮点数相等,具体如下: 15 ----------------------- Page 16----------------------- bool Equals(float 1hs,float rhs) { Return fabs(1hs - rhs)<EPSILON; } //完全不用在意这些事,因为D3DXVECTOR3的重载运算符已经完成了这些 功能 *D3D 表示向量长度: ( CONST D3DXVECTOR3 *PV //需要求模的向量 例: Float magnitude = D3DXVec3Length(&v); * D3DXVECTOR3 *pOut, //输出单位向量 CONST D3DXVECTOR3 *pV //输入的向量 * D3DVECTOR3 V(0.0F,-1.0F,5.0F); D3DVECTOR3 SUM = U + V; * D3DVECTOR3 V(0.0F,-1.0F,5.0F); D3DVECTOR3 SUM = U - V; * D3DVECTOR3 scaledVec = U * 10.0f; * FLOAT D3DXVec3Dot( CONST D3DVECTOR3 *PV2; ) 例: D3DVECTOR3 V(0.0F,-1.0F,5.0F); 16 ----------------------- Page 17----------------------- float dot = D3DXVec3Dot(&u,&v); ================================================================= D3D * D3DXMATRIX B(…); D3DXMATRIX C = A * B; * 1)使用”.”运算符 A._11 = 1.0f; 2)使用()运算符 M ( 0 , 0 ) = 5.0f; * D3DXMATRIX *pOut ); D3DXMATRIX M; D3DXMatrixIdentity(&M); * D3DXMATRIX *pOut, CONST D3DXMATRIX *pM ); * D3DXMATRIX *pOut, FLOAT *pDeterminant, //通常忽略第二个参数都设置为0 ); 例: D3DXMATRIX B; D3DXMatrixInverse (&B,0,&A); 17 ----------------------- Page 18----------------------- D3D 平面的描述 D3D中的平面 点与平面之间的关系 平面的构造 平面单位化 平面变换 D3D 射线与平面相交判断 D3D D3DTRANSFORMSTATETYPE State, //变换类型 CONST D3DMATRIX* pMatrix //变换矩阵 参数State可以是一下任意类型: D3DTS_WORLD //世界变换 D3DTS_VIEW //视图变换 D3DTS_PROJECTION //投影变换 *平移变换 D3DXMATRIX *pOut, //输出矩阵 FLOAT x, //X轴上的平移量 FLOAT y, //Y轴上的平移量 FLOAT z //Z轴上的平移量 *缩放变换 D3DXMATRIX *pOut, //输出矩阵 FLOAT sx, //X轴上的缩放量 FLOAT sy, //Y轴上的缩放量 FLOAT sz //Z轴上的缩放量 *旋转变换 18 ----------------------- Page 19----------------------- D3DXMATRIX *WINAPI D3DXMatrixRotationX( //绕X轴旋转 D3DXMATRIX *pOut, //输出矩阵 FLOAT Angle //旋转角度 D3DXMATRIX *WINAPI D3DXMatrixRotationY( //绕Y轴旋转 D3DXMATRIX *pOut, //输出矩阵 FLOAT Angle //旋转角度 D3DXMATRIX *WINAPI D3DXMatrixRotationZ( //绕Z轴旋转 D3DXMATRIX *pOut, //输出矩阵 FLOAT Angle //旋转角度 D3DXMATRIX *WINAPI D3DXMatrixRotationAxis( //绕任意轴旋转 D3DXMATRIX *pOut, //输出矩阵 CONST D3DXVECTOR3 *Pv //旋转中心轴向量 FLOAT Angle //旋转角度 *组合变换 D3DXMATRIX *pOut, //输出变换矩阵 CONST D3DXMATRIX *pM1, //输入矩阵 CONST D3DXMATRIX *pM2 //输入矩阵 ================================================================= 19 ----------------------- Page 20----------------------- 纹理 从磁盘文件获取纹理 LPDIRECT3DDEVICE9 pDevice, //Direct3D设备指针 该函数支持的图形文件类型:bmp、dds、dib、jpg、png以及tga等。 设置当前要渲染的纹理 DWORD Stage, //多级纹理的索引,从0-7,单层纹理取0 设置纹理的渲染状态 DWORD Stage, //当前设置的多级纹理的索引 第二个参数D3DTEXTURESTAGESTATETYPE Type取值: D3DTSS_COLOROP = 1, //纹理层的颜色混合方式 20 ----------------------- Page 21----------------------- D3DTSS_COLORARG2 = 3, //颜色混合的第二个参数 设置纹理采样属性 DWORD Sampler, //指定纹理采样属性的纹理层ID(0~7) 第二个参数D3DSAMPLERSTATETYPE Type取值: 21 ----------------------- Page 22----------------------- ================================================================= 从一张纹理图形中生成多级纹理 LPDIRECT3DDEVICE9 pDevice, //Direct3D设备指针 包装纹理寻址 镜像纹理寻址 夹取纹理寻址 |
DirectX函数总结2
最新推荐文章于 2020-06-25 17:07:43 发布