Direct3D 9 入門例子程式 圓錐體,direct3d圓錐體
介紹Directx3D 9什麼是DirectX,很好說了,Win32 C++ API,主要是多媒體編程方面的,優點體現在高效能了,現在我知道的版本最高是D3D11,但是我是學習入門的,從D3D9開始,不算很是落伍。Directx3D 元素D3D元素很多,這裡說的元素是程式中用到的元素。1〉D3D 編程的起點,可以理解成出所用的D3D SDK程式集。2〉D3D present parameter ,呈現參數,專業的參數是通過一頓檢測配置成最好的。程式中的參數簡單的用預設的顯示參數。3〉D3D Device 裝置 這個可以理解成多媒體裝置的虛擬,在D3D理論中各種概念。4〉D3D Vertex 頂點 一個圖形中有意義的三維頂點,比較特殊一點的地方,例如,三角形頂點。5〉D3D Vertex Buffer 頂點緩衝,暫時存放頂點的記憶體地區。程式結構MFC 基於對話方塊的程式。MFC很好理解,一個東西擺在哪兒,遇見什麼事件就幹事件相對應的事情。程式解析敘述初始化1〉初始化D3D2〉初始化邏輯單位配置1〉配置D3D2〉配置邏輯執行1〉旋轉2〉呈現結束1〉釋放各種對象UML
程式實現架構一個對話方塊繼承自CWnd
細節1. 建立工程D3DMFCApp2. 添加按鈕 開始 結束 到D3DMFCAppDlg 主視窗。3. 添加類 D3DDlg 到工程 隨便找個圖片 (jpg我的是)大小改為 256x256 的 命名texture.jpg 複製到工程。4. D3DMFCAppDlg 添加變數
CD3DDlg m_D3DDlg;
5. D3DMFCAppDlg 開始按鈕產生函數添加
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,那麼路徑配置正確這樣寫不會有錯誤。8. 類嚮導添加訊息函數 記得是類嚮導 我這個是添加後的結果。
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這麼大的概念誰也沒有辦法一下子說清楚,只有多練,我寫這個程式寫了三周,其中一個Bug卡了將近一周。誰解釋也是白搭,只有多練,不過推薦的就是抄程式也要抄對。程式1>MFC 工程始入門的最好的工程類型,我試過Win32,一個架構就把人搭暈了。不如MFC 乾脆,但是MFC 僅限學習,到了應用還是Win32,那時應該好說了。2>變數是 D3DDevice9 而不是 D3D9Device,當然你可以自己隨便編寫,不過人家官網是這樣,慢慢習慣了好學習。3>函數調用跟Win32 一個風格,例如
m_pD3DDevice9->CreateVertexBuffer(sizeof(vertices1),0,D3DFVF_CUSTOMVERTEX1,D3DPOOL_DEFAULT,&m_pVB1,NULL);
每一個參數一行,至於什麼函數分行寫還是需要自己把握的。微軟內部調用時第一個參數和函數同行,最後一個括弧會再分一行,我覺得不好就調成這樣的格式了。4>圖片複製到工程需要修改屬性,類型是資源編譯器,要不然報什麼連結1102的錯誤。其他如果想學習更多參考 DirectX3D9 初級教程 祝曉鷹 餘峰寫的,我看了特別好,百度好評的時候想給好評的結果給了一個1星就再也改不了了,把我氣的,這裡致歉一下。
direct3d 9下載
這個太簡單了,
你可以下載一個迅雷,
然後點擊推薦軟體,
裡面就有DIRECT 3D 9.的下載,
然後點擊安裝就可以了,
或者直接在華軍軟體上找,
很容易的.......
硬體加速的 Direct3D 9+ 不可用,因為顯示驅動程式不支援它您可可以可以從硬體製造商那裡獲得新
臭小子,遇到我你算幸運了,我家也是,我玩不了CF火線,很顯然,你沒安裝顯卡,去driver.zol.com.cn/detail/12/116654.shtml網址,安裝萬能顯卡就行了,還要把硬碟加速調到最高,就這些了,我就是這樣解決的!還要安裝dxsetup。exe就好了,你看,是不是?
我知道你玩不了大型遊戲,是不是很上火?
下面的圖片是玩不了遊戲的:選我!