3d-объекты в DirectX. C++ программа.

Тема в разделе "WASM.DirectX", создана пользователем xGOR, 20 ноя 2011.

  1. xGOR

    xGOR New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2008
    Сообщения:
    32
    Здравствуйте. Взял пример кода программы из одной книги, а он не работает правильно. В окошке должен появится квадрат и вращатся, но вместо этого у левом верхнем углу есть один пиксель, зарисованный. Как исправить?

    Код:
    Код (Text):
    1. #include <Windows.h>
    2. #include <d3d9.h>
    3. #include <d3dx9.h>
    4. //#include <mmsystem.h>
    5.  
    6. #pragma comment(lib, "d3d9.lib")
    7. #pragma comment(lib, "d3dx9.lib")
    8. #pragma comment(lib, "Winmm.lib")
    9.  
    10. LPDIRECT3D9 pDirect3D=NULL;
    11. LPDIRECT3DDEVICE9 pDirect3DDevice=NULL;
    12.  
    13. LPDIRECT3DVERTEXBUFFER9 pBufferVershin=NULL;
    14. struct CUSTOMVERTEX
    15. {
    16.     float X, Y, Z;
    17.     DWORD color;
    18. };
    19. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
    20.  
    21. void Matrix()
    22. {
    23.     D3DXMATRIX MatrixWorld;
    24.     D3DXMATRIX MatrixView;
    25.     D3DXMATRIX MatrixProjection;
    26.  
    27.     UINT Time=timeGetTime() % 5000;
    28.     FLOAT Angle=Time*(2.0f * D3DX_PI)/5000.0f;
    29.     D3DXMatrixRotationY(&MatrixWorld,Angle);
    30.     pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);
    31.     D3DXMatrixLookAtLH(&MatrixView, &D3DXVECTOR3(0.0f,0.0f,-8.0f), &D3DXVECTOR3(0.0f,0.0f,0.0f), &D3DXVECTOR3(0.0f,1.0f,0.0f));
    32.     pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView);
    33.     D3DXMatrixPerspectiveFovLH(&MatrixProjection, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
    34.     pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection);
    35.  
    36. }
    37.  
    38. HRESULT InitialBufferVershin()
    39. {
    40.    
    41.     CUSTOMVERTEX Vershin[]=
    42.     {
    43.         {1.0f, -1.0f, 0.0f, 0x000000fff },    //A
    44.         {-1.0f, -1.0f, 0.0f, 0x000000fff },        //B
    45.         {-1.0f, 1.0f, 0.0f, 0x000000fff },        //C
    46.  
    47.         {-1.0f, 1.0f, 0.0f, 0x000000fff },        //C
    48.         {1.0f, 1.0f, 0.0f, 0x000000fff },        //D
    49.         {1.0f, -1.0f, 0.0f, 0x000000fff }    //A
    50.     };
    51.    
    52.     if(FAILED(pDirect3DDevice->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&pBufferVershin,NULL))) return E_FAIL;
    53.     VOID* pBV;
    54.     if(FAILED(pBufferVershin->Lock(0,sizeof(Vershin),(void**)&pBV,0))) return E_FAIL;
    55.     memcpy(pBV,Vershin,sizeof(Vershin));
    56.     pBufferVershin->Unlock();
    57.     return S_OK;
    58. }
    59.  
    60. void RenderingDirect3D()
    61. {
    62.     if(pDirect3DDevice==NULL) return;
    63.     pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,0),1.0f,0);
    64.     pDirect3DDevice->BeginScene();
    65.     Matrix();
    66.     pDirect3DDevice->SetStreamSource(0,pBufferVershin,0,sizeof(CUSTOMVERTEX));
    67.     pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    68.     pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
    69.     pDirect3DDevice->EndScene();
    70.     pDirect3DDevice->Present(NULL,NULL,NULL,NULL);
    71. }
    72.  
    73. void DeleteDirect3D()
    74. {
    75.     if(pBufferVershin!=NULL)
    76.     {
    77.         pBufferVershin->Release();
    78.     }
    79.     if(pDirect3DDevice!=NULL)
    80.     {
    81.         pDirect3DDevice->Release();
    82.     }
    83.     if(pDirect3D!=NULL)
    84.     {
    85.         pDirect3D->Release();
    86.     }
    87. }
    88.  
    89. HRESULT InitialDirect3D(HWND hwnd)
    90. {
    91.     if(NULL==(pDirect3D=Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL;
    92.     D3DDISPLAYMODE display;
    93.     if(FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&display))) return E_FAIL;
    94.     D3DPRESENT_PARAMETERS Direct3DParametr;
    95.     ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));
    96.     Direct3DParametr.Windowed=true;
    97.     Direct3DParametr.SwapEffect=D3DSWAPEFFECT_DISCARD;
    98.     Direct3DParametr.BackBufferFormat=display.Format;
    99.     if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd , /*D3DCREATE_HARDWARE_VERTEXPROCESSING*/  D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice))) return E_FAIL;
    100.     pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
    101.     pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    102.     return S_OK;
    103. }
    104.  
    105.  
    106. LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
    107. {
    108.     switch(msg)
    109.     {
    110.     case WM_PAINT:
    111.         RenderingDirect3D();
    112.         //ValidateRect(hwnd,NULL);
    113.         break;
    114.     case WM_DESTROY:
    115.         {
    116.             PostQuitMessage(0);
    117.             DeleteDirect3D();
    118.             return 0;
    119.             break;
    120.         }
    121.  
    122.     }
    123. return (DefWindowProc(hwnd,msg,wparam,lparam));
    124.  
    125. }
    126.  
    127. int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
    128. {
    129.     WNDCLASSEX windowsclass;
    130.     HWND hwnd;
    131.     MSG msg;
    132.     ZeroMemory(&msg,sizeof(MSG));
    133.     windowsclass.cbSize=sizeof(WNDCLASSEX);
    134.     windowsclass.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    135.     windowsclass.lpfnWndProc=MainWinProc;
    136.     windowsclass.cbClsExtra=0;
    137.     windowsclass.cbWndExtra=0;
    138.     windowsclass.hInstance=hinstance;
    139.     windowsclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    140.     windowsclass.hCursor=LoadCursor(NULL, IDC_ARROW);
    141.     windowsclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
    142.     windowsclass.lpszMenuName=NULL;
    143.     windowsclass.lpszClassName="WINDOWSCLASS";
    144.     windowsclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
    145.     if(!RegisterClassEx(&windowsclass)) return 0;
    146.     if(!(hwnd=CreateWindowEx(NULL, "WINDOWSCLASS", "Лабораторна робота №3", WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,400,600, NULL, NULL, hinstance, NULL))) return 0;
    147.     //SetTimer(hwnd,Timer1,1000,(TIMERPROC)NULL);
    148.     InitialDirect3D(hwnd);
    149.  
    150.     InitialBufferVershin();
    151.     ShowWindow(hwnd, SW_SHOWDEFAULT);
    152.     UpdateWindow(hwnd);
    153.     while(msg.message != WM_QUIT)
    154.     {
    155.        
    156.         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    157.         {
    158.             TranslateMessage(&msg);
    159.             DispatchMessage(&msg);
    160.         }
    161.         else
    162.         {
    163.             RenderingDirect3D();
    164.         }
    165.        
    166.     }
    167.     return msg.wParam;
    168. }
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    D3DFVF_XYZRHW это уже трансформированные, экранные координаты. Нужно - D3DFVF_XYZ
     
  3. xGOR

    xGOR New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2008
    Сообщения:
    32
    да, точно.