2010-08-04 68 views
1
#include <windows.h> 
#include <d3d9.h> 
#include <D3DX9Mesh.h> 

#define THROW_ERROR_AND_EXIT(x) { \ 
    MessageBox(0,x,0,0); \ 
    return -1; \ 
    } 

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    // Handle close event 
    switch(msg) 
    { 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 
    } 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    // Registering class 
    WNDCLASSEX wcex; 

    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style= CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc= (WNDPROC)WndProc; 
    wcex.cbClsExtra= 0; 
    wcex.cbWndExtra= 0; 
    wcex.hInstance= hInstance; 
    wcex.hIcon= 0; 
    wcex.hCursor= LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1); 
    wcex.lpszMenuName= 0; 
    wcex.lpszClassName= "MyMeshViewer"; 
    wcex.hIconSm= 0; 

    RegisterClassEx(&wcex); 

    // Creating Window 
    HWND hWnd = CreateWindow("MyMeshViewer", "MyMeshViewer", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); 

    // Creating Direct3D object 
    LPDIRECT3D9 d3dObject=NULL; 
    LPDIRECT3DDEVICE9 d3dDevice=NULL; 

    d3dObject=Direct3DCreate9(D3D_SDK_VERSION); 

    // Creating Direct3D device 
    if(NULL == d3dObject) 
     THROW_ERROR_AND_EXIT("NULL == d3dObject"); 
    D3DPRESENT_PARAMETERS presParams; 
    ZeroMemory(&presParams,sizeof(presParams)); 
    presParams.Windowed=TRUE; 
    presParams.SwapEffect=D3DSWAPEFFECT_DISCARD; 
    presParams.BackBufferFormat=D3DFMT_UNKNOWN; 
    presParams.PresentationInterval=D3DPRESENT_INTERVAL_ONE; 
    HRESULT hr=d3dObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &presParams, &d3dDevice); 
    if(FAILED(hr)) 
     THROW_ERROR_AND_EXIT("d3dObject->CreateDevice"); 

    // Rendering 
    d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,0),1.0f,0); 
    d3dDevice->BeginScene(); 

    // Loading the mesh 
    LPD3DXBUFFER materialBuffer = NULL; 
    DWORD numMaterials = 0; 
    LPD3DXMESH mesh = NULL; 
    hr=D3DXLoadMeshFromX("tiger.x", D3DXMESH_SYSTEMMEM, 
     d3dDevice, NULL, 
     &materialBuffer,NULL, &numMaterials, 
     &mesh); 
    if(FAILED(hr)) 
     THROW_ERROR_AND_EXIT("hr=D3DXLoadMeshFromX"); 

    // Loading the material buffer 
    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)materialBuffer->GetBufferPointer(); 
    // Holding material and texture pointers 
    D3DMATERIAL9 *meshMaterials = new D3DMATERIAL9[numMaterials]; 
    LPDIRECT3DTEXTURE9 *meshTextures = new LPDIRECT3DTEXTURE9[numMaterials]; 
    // Filling material and texture arrays 
    for (DWORD i=0; i<numMaterials; i++) 
    { 
     // Copy the material 
     meshMaterials[i] = d3dxMaterials[i].MatD3D; 

     // Set the ambient color for the material (D3DX does not do this) 
     meshMaterials[i].Ambient = meshMaterials[i].Diffuse; 

     // Create the texture if it exists - it may not 
     meshTextures[i] = NULL; 
     if (d3dxMaterials[i].pTextureFilename) 
      D3DXCreateTextureFromFile(d3dDevice, d3dxMaterials[i].pTextureFilename,  &meshTextures[i]); 
    } 

    materialBuffer->Release(); 

    for (DWORD i=0; i<numMaterials; i++) 
    { 
     // Set the material and texture for this subset 
     d3dDevice->SetMaterial(&meshMaterials[i]); 
     d3dDevice->SetTexture(0,meshTextures[i]); 
     // Draw the mesh subset 
     mesh->DrawSubset(i); 
    } 

    d3dDevice->EndScene(); 
    d3dDevice->Present(NULL, NULL, NULL, NULL);  

    // Show Window 
    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    // Handle messages 
    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    }  

    return (int)msg.wParam; 
} 

這是我的程序加載網格tiger.x並顯示它。但它沒有被顯示。變量numMaterials的值始終保持爲1。我想我的程序有一些問題。有人請幫我弄明白。謝謝。使用DirectX 9顯示網格


下面

http://pastebin.com/DuvpS4mh

+0

Phew長段代碼人 – ckv 2010-08-04 12:24:54

回答

1

的問題tiger.x網格文件是要渲染的窗口,然後調用UpdateWindow這迫使重新油漆,從而消除了圖紙。

我建議您下載DirectX SDK並查看示例以瞭解如何構建「正確的」渲染循環。

+0

謝謝。我應該像[這](http://pastebin.com/005A5aYU) – bdhar 2010-08-04 13:54:31

0
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_PAINT: 
    { 
     // Rendering 
     d3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0); 
     d3dDevice->BeginScene(); 


     for (DWORD i = 0; i < numMaterials; i++) 
     { 
      // Set the material and texture for this subset 
      d3dDevice->SetMaterial(&meshMaterials[i]); 
      d3dDevice->SetTexture(0, meshTextures[i]); 
      // Draw the mesh subset 
      mesh->DrawSubset(i); 
     } 

     d3dDevice->EndScene(); 
     d3dDevice->Present(NULL, NULL, NULL, NULL); 

    } 
    break; 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 

您必須處理WM_PAINT事件。