本文主要是介绍Direct3D 9 入门例子程序 圆锥体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
介绍
Directx3D 9
Directx3D 元素
程序结构
程序解析
叙述
UML
程序实现
框架
细节
CD3DDlg m_D3DDlg;
m_D3DDlg.CreateEx(0,AfxRegisterWndClass(NULL,NULL,NULL,NULL),L"D3D Window",WS_POPUP|WS_CAPTION|WS_VISIBLE,CRect(100,100,500,500),this,0);
6. D3DMFCAppDlg 结束按钮生成函数添加
m_D3DDlg.DestroyWindow();
7. CD3DDlg 头文件引入文件和定义顶点结构
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#include <d3d9.h>
#include <d3dx9math.h>typedef struct _CUSTOMVERTEX1
{D3DXVECTOR3 position;D3DXVECTOR3 normal;float fu;float fv;
}CUSTOMVERTEX1;#define D3DFVF_CUSTOMVERTEX1 (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)typedef struct _CUSTOMVERTEX2
{D3DXVECTOR3 position;D3DXVECTOR3 normal;
}CUSTOMVERTEX2;#define D3DFVF_CUSTOMVERTEX2 (D3DFVF_XYZ|D3DFVF_NORMAL)
这里或许涉及到安装DirectX 不过网上很多例子了,我只关注实例练习,只是说如果安装了D3D SDK,那么路径配置正确这样写不会有错误。
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnTimer(UINT_PTR nIDEvent);
9. 类向导添加私有函数
void InitD3D9(void);
void Render(void);
void CleanUp(void);
void InitGeometry(void);
void SetupMatrices(void);
void SetLight(void);
void SetMaterial1(void);
void SetMaterial2(void);
10 .类向导添加私有变量
LPDIRECT3D9 m_pD3D9;
LPDIRECT3DDEVICE9 m_pD3DDevice9;
LPDIRECT3DVERTEXBUFFER9 m_pVB1;
LPDIRECT3DVERTEXBUFFER9 m_pVB2;
LPDIRECT3DTEXTURE9 m_pD3DTexture9;
int m_nRotateY;
11. CD3DDlg实现文件 初始化 D3D
<pre name="code" class="cpp">void CD3DDlg::InitD3D9(void)
{m_pD3D9=Direct3DCreate9(D3D_SDK_VERSION);D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS));d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;d3dpp.BackBufferCount=1;d3dpp.EnableAutoDepthStencil=TRUE;d3dpp.AutoDepthStencilFormat=D3DFMT_D16;d3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;m_pD3D9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&m_pD3DDevice9);m_pD3DDevice9->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);m_pD3DDevice9->SetRenderState(D3DRS_LIGHTING,TRUE);m_pD3DDevice9->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
}
12. 初始化图元
void CD3DDlg::InitGeometry(void)
{D3DXCreateTextureFromFile(m_pD3DDevice9,_T("texture.jpg"),&m_pD3DTexture9);CUSTOMVERTEX1 vertices1[32];vertices1[0].position=D3DXVECTOR3(-1.0f,0.0f,0.0f);vertices1[0].normal=D3DXVECTOR3(-1.0f,0.0f,0.0f);vertices1[0].fu=0.0f;vertices1[0].fv=0.5f;for (int i=1;i<32;i++){float theat=(i-1)*2*D3DX_PI/30.0f;vertices1[i].position=D3DXVECTOR3(1.0f,sinf(theat),cosf(theat));vertices1[i].normal=D3DXVECTOR3(0.0f,sinf(theat),cosf(theat));float m=sqrtf(5.0f);float beta=(0.5f-1.0f/m+(i-1.0f)/15.0f/m)*D3DX_PI;vertices1[i].fu=0.5*sinf(beta);vertices1[i].fv=0.5-0.5*cosf(beta);}m_pD3DDevice9->CreateVertexBuffer(sizeof(vertices1),0,D3DFVF_CUSTOMVERTEX1,D3DPOOL_DEFAULT,&m_pVB1,NULL);VOID* pVertices=NULL;m_pVB1->Lock(0,sizeof(vertices1),&pVertices,0);memcpy(pVertices,vertices1,sizeof(vertices1));m_pVB1->Unlock();CUSTOMVERTEX2 vertices2[32];vertices2[0].position=D3DXVECTOR3(1.0f,0.0f,0.0f);vertices2[0].normal=D3DXVECTOR3(1.0f,0.0f,0.0f);for (int i=1;i<32;i++){float theat=(i-1)*2*D3DX_PI/30.0f;vertices2[i].position=vertices1[32-i].position;vertices2[i].normal=D3DXVECTOR3(1.0f,0.0f,0.0f);}m_pD3DDevice9->CreateVertexBuffer(sizeof(vertices2),0,D3DFVF_CUSTOMVERTEX2,D3DPOOL_DEFAULT,&m_pVB2,NULL);m_pVB2->Lock(0,sizeof(vertices2),&pVertices,0);memcpy(pVertices,vertices2,sizeof(vertices2));m_pVB2->Unlock();
}
13. 设置左边变换
void CD3DDlg::SetupMatrices(void)
{D3DXMATRIX matWorld;float angle=m_nRotateY*D3DX_PI/180;D3DXMatrixRotationY(&matWorld,angle );m_pD3DDevice9->SetTransform(D3DTS_WORLD,&matWorld);D3DXVECTOR3 eye(0.0f,3.0f,-5.0f);D3DXVECTOR3 lookAt(0.0f,0.0f,0.0f);D3DXVECTOR3 up(0.0f,1.0f,0.0f);D3DXMATRIX matView;D3DXMatrixLookAtLH(&matView,&eye,&lookAt,&up);m_pD3DDevice9->SetTransform(D3DTS_VIEW,&matView);D3DXMATRIXA16 matProj;D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);m_pD3DDevice9->SetTransform(D3DTS_PROJECTION,&matProj);
}
14. 设置材料1
void CD3DDlg::SetMaterial1(void)
{D3DMATERIAL9 mtrl;ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));mtrl.Diffuse.r=mtrl.Ambient.r=1.0f;mtrl.Diffuse.g=mtrl.Ambient.g=1.0f;mtrl.Diffuse.b=mtrl.Ambient.b=1.0f;mtrl.Diffuse.a=mtrl.Ambient.a=1.0f;m_pD3DDevice9->SetMaterial(&mtrl);
}
15. 设置材料2
void CD3DDlg::SetMaterial2(void)
{D3DMATERIAL9 mtrl;ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));mtrl.Diffuse.r=mtrl.Ambient.r=1.0f;mtrl.Diffuse.g=mtrl.Ambient.g=1.0f;mtrl.Diffuse.b=mtrl.Ambient.b=0.0f;mtrl.Diffuse.a=mtrl.Ambient.a=1.0f;m_pD3DDevice9->SetMaterial(&mtrl);
}
16.设置关照
void CD3DDlg::SetLight(void)
{D3DLIGHT9 light;ZeroMemory(&light,sizeof(light));light.Type=D3DLIGHT_DIRECTIONAL;light.Diffuse.r=1.0f;light.Diffuse.g=1.0f;light.Diffuse.b=1.0f;light.Direction=D3DXVECTOR3(0.0f,0.0,1.0f);light.Range=1000.0f;m_pD3DDevice9->SetLight(0,&light);m_pD3DDevice9->LightEnable(0,TRUE);m_pD3DDevice9->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_RGBA(32,32,32,0));
}
17. 渲染 执行
void CD3DDlg::Render(void)
{m_pD3DDevice9->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);m_pD3DDevice9->BeginScene();SetupMatrices();SetLight();SetMaterial1();m_pD3DDevice9->SetTexture(0,m_pD3DTexture9);m_pD3DDevice9->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);m_pD3DDevice9->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);m_pD3DDevice9->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);m_pD3DDevice9->SetFVF(D3DFVF_CUSTOMVERTEX1);m_pD3DDevice9->SetStreamSource(0,m_pVB1,0,sizeof(CUSTOMVERTEX1));m_pD3DDevice9->DrawPrimitive(D3DPT_TRIANGLEFAN,0,30);m_pD3DDevice9->SetTexture(0,NULL);m_pD3DDevice9->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DISABLE);SetMaterial2();m_pD3DDevice9->SetFVF(D3DFVF_CUSTOMVERTEX2);m_pD3DDevice9->SetStreamSource(0,m_pVB2,0,sizeof(CUSTOMVERTEX2));m_pD3DDevice9->DrawPrimitive(D3DPT_TRIANGLEFAN,0,30);m_pD3DDevice9->EndScene();m_pD3DDevice9->Present(NULL,NULL,NULL,NULL);
}
18. 释放资源
void CD3DDlg::CleanUp(void)
{m_pVB1->Release();m_pVB2->Release();m_pD3DTexture9->Release();m_pD3DDevice9->Release();m_pD3D9->Release();
}
19. 终于该公有函数了 初始化
int CD3DDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CWnd::OnCreate(lpCreateStruct) == -1)return -1;InitD3D9();InitGeometry();SetTimer(1,40,NULL);return 0;
}
20. 定时执行渲染
void CD3DDlg::OnTimer(UINT_PTR nIDEvent)
{Render();m_nRotateY+=2;CWnd::OnTimer(nIDEvent);
}
21. 结束
void CD3DDlg::OnDestroy()
{CWnd::OnDestroy();CleanUp();
}
程序结果
总结
Direct3D
程序
m_pD3DDevice9->CreateVertexBuffer(sizeof(vertices1),0,D3DFVF_CUSTOMVERTEX1,D3DPOOL_DEFAULT,&m_pVB1,NULL);
每一个参数一行,至于什么函数分行写还是需要自己把握的。微软内部调用时第一个参数和函数同行,最后一个括号会再分一行,我觉得不好就调成这样的格式了。
其他
这篇关于Direct3D 9 入门例子程序 圆锥体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!