现在的位置: 首页 > 综合 > 正文

VC,DirectX8开发实例(照相机和影子)

2013年09月08日 ⁄ 综合 ⁄ 共 5031字 ⁄ 字号 评论关闭
 

//VCDirectX8开发实例照相机和影子
// http://wisdom.sakura.ne.jp/system/directx/dxg8.html
 
#include <windows.h>
#include <d3d8.h>
#include <d3dx8.h>
 
#define TITLE TEXT("Kitty on your lap")
 
IDirect3D8 * pDirect3D;
IDirect3DDevice8 * pD3Device;
 
D3DPRESENT_PARAMETERS d3dpp;
 
D3DXVECTOR3 view(0 , 0 , 600);
 
typedef struct {
        float x,y,z;
        DWORD color;
} D3DVERTEX;
 
void SetRender(HWND hWnd) {
        RECT rect;
        D3DXMATRIX d3dm;
 
        GetClientRect(hWnd,&rect);
        //生成viewtransform用左手坐标系变换队列
        D3DXMatrixLookAtLH(&d3dm , &view ,
               &D3DXVECTOR3(10 , -200 , 0) , 
               &D3DXVECTOR3(0 , 1 , 0));
        
        pD3Device->SetTransform(D3DTS_VIEW , &d3dm);
        //視野 (FOV) に基づいて、右手座標系パースペクティブ射影行列を作成する
        D3DXMatrixPerspectiveFovLH(&d3dm , 
               D3DXToRadian(45.0) ,//回转角度
               (float)rect.right / (float)rect.bottom , 0 , 1000);
        
        pD3Device->SetTransform(D3DTS_PROJECTION , &d3dm);
 
        pD3Device->SetRenderState(D3DRS_CULLMODE , D3DCULL_NONE);
        pD3Device->SetRenderState(D3DRS_LIGHTING , FALSE);
}
 
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
        static D3DVERTEX pt[3] = {
               {200 , -10 , 0 , 0xFFFF0000} ,
               {400 , -200 , 0 , 0xFF00FF00} ,
               {10 , -200 , 0 , 0xFF0000FF}
        };
        D3DXMATRIX d3dm;
        D3DXVECTOR3 d3dv;
 
        switch(msg){
               case WM_DESTROY:
                       PostQuitMessage(0);
                       break;
               case WM_CREATE:
                       SetTimer(hWnd , 1 , 10 , NULL);
                       return 0;
               case WM_PAINT:
                       pD3Device->Clear(0 , NULL , D3DCLEAR_TARGET ,
                               D3DCOLOR_XRGB(0xFF , 0xFF , 0xFF) , 1.0 , 0);
                       pD3Device->BeginScene();
                       pD3Device->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE);
                       pD3Device->DrawPrimitiveUP(
                               D3DPT_TRIANGLELIST , 1 , pt , sizeof (D3DVERTEX));
                       pD3Device->EndScene();
 
                       pD3Device->Present(NULL,NULL,NULL,NULL);
                       ValidateRect(hWnd,NULL);
                       break;
               case WM_SIZE:
                       if(pD3Device && (wp == SIZE_RESTORED || wp == SIZE_MAXIMIZED)) {
                               d3dpp.BackBufferWidth = LOWORD(lp);
                               d3dpp.BackBufferHeight = HIWORD(lp);
                               pD3Device->Reset(&d3dpp);
 
                               SetRender(hWnd);
                               InvalidateRect(hWnd,NULL,TRUE);
                       }
                       return 0;
               case WM_TIMER:
                       //Y轴作为回转轴,进行回转
                       D3DXMatrixRotationY(&d3dm , D3DXToRadian(2));//回转角度
                       d3dv = view;
                       view.x = d3dv.x * d3dm.m[0][0] +
                               d3dv.y * d3dm.m[1][0] + d3dv.z * d3dm.m[2][0];
                       view.y = d3dv.x * d3dm.m[0][1] +
                               d3dv.y * d3dm.m[1][1] + d3dv.z * d3dm.m[2][1];
                       view.z = d3dv.x * d3dm.m[0][2] +
                               d3dv.y * d3dm.m[1][2] + d3dv.z * d3dm.m[2][2];
        
                       D3DXMatrixLookAtLH(&d3dm , &view ,
                               &D3DXVECTOR3(10 , -200 , 0) , &D3DXVECTOR3(0 , 1 , 0));
                       pD3Device->SetTransform(D3DTS_VIEW , &d3dm);
                       InvalidateRect(hWnd , NULL , TRUE);
                       return 0;
        }
        return DefWindowProc(hWnd , msg , wp , lp);
}
 
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance ,
                                  LPSTR lpCmdLine,int nCmdShow) {
        MSG msg;
        HWND hWnd;
        WNDCLASS winc;
        D3DDISPLAYMODE dmode;
 
        pDirect3D = Direct3DCreate8(D3D_SDK_VERSION);
        pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&dmode);
 
        ZeroMemory(&d3dpp , sizeof (d3dpp));
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = dmode.Format;
        d3dpp.BackBufferCount = 1;
 
        winc.style                     = CS_CLASSDC;
        winc.lpfnWndProc       = WndProc;
        winc.cbClsExtra        = winc.cbWndExtra              = 0;
        winc.hInstance         = hInstance;
        winc.hIcon                     = LoadIcon(NULL , IDI_APPLICATION);
        winc.hCursor           = LoadCursor(NULL,IDC_ARROW);
        winc.hbrBackground     = (HBRUSH)GetStockObject(WHITE_BRUSH);
        winc.lpszMenuName      = NULL;
        winc.lpszClassName     = TEXT("KITTY");
 
        if(!RegisterClass(&winc)) return 0;
 
        hWnd = CreateWindow(TEXT("KITTY") , TITLE ,
                       WS_OVERLAPPEDWINDOW | WS_VISIBLE , 
                       CW_USEDEFAULT , CW_USEDEFAULT ,
                       CW_USEDEFAULT , CW_USEDEFAULT ,
                       (HWND)NULL,(HMENU)NULL , hInstance , (LPSTR)NULL
        );
 
        pDirect3D->CreateDevice(
               D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd ,
               D3DCREATE_SOFTWARE_VERTEXPROCESSING , &d3dpp , &pD3Device
        );
        //
        SetRender(hWnd);
 
        while (GetMessage(&msg , NULL , 0 , 0 )) {
               TranslateMessage(&msg);
               DispatchMessage(&msg);
        }
 
        pDirect3D->Release();
        pD3Device->Release();
        return msg.wParam;
}
 

 

抱歉!评论已关闭.