VC,DirectX8开发实例(index buffer)

 
// VCDirectX8开发实例index buffer
// http://wisdom.sakura.ne.jp/system/directx/dxg10.html
//画出复杂颜色的图形
 
#include <windows.h>
#include <d3d8.h>
#include <d3dx8.h>
 
#define TITLE TEXT("Kitty on your lap")
#define D3DFVF D3DFVF_XYZRHW | D3DFVF_DIFFUSE
 
IDirect3D8 * pDirect3D;
IDirect3DDevice8 * pD3Device;
D3DPRESENT_PARAMETERS d3dpp;
 
typedef struct {
        float x , y , z , w;
        DWORD color;
} D3DVERTEX;
 
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
        static D3DVERTEX pt[] = {
               {10 , 10 , 0 , 1 , 0xFFFF0000} ,
               {200 , 10 , 0 , 1 , 0xFFFF00FF} ,
               {10 , 200 , 0 , 1 , 0xFFFF00FF} ,
               {200 , 200 , 0 , 1 , 0xFF0000FF}
        };
        static WORD index[] = { 0 , 1 , 2 , 3 , 2 , 1};
        BYTE *bBuf;
        static IDirect3DVertexBuffer8 *d3dvb;
        static IDirect3DIndexBuffer8 *d3dib;
 
        switch(msg){
               case WM_DESTROY:
                       PostQuitMessage(0);
                       break;
               case WM_CREATE:
                       pDirect3D->CreateDevice(
                               D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd ,
                               D3DCREATE_SOFTWARE_VERTEXPROCESSING , 
                               &d3dpp , &pD3Device
                       );
 
                       pD3Device->CreateVertexBuffer(
                               sizeof (D3DVERTEX) * 4 , 0 , 
                               D3DFVF , 
                               D3DPOOL_MANAGED , 
                               &d3dvb);
                       d3dvb->Lock(0 , 0 , &bBuf , 0);
                       memcpy(bBuf , pt , sizeof (D3DVERTEX) * 4);
                       d3dvb->Unlock();
 
                       pD3Device->CreateIndexBuffer(sizeof (WORD) * 6 ,//size
                               D3DUSAGE_WRITEONLY , //指定表示资源的控制方法的定数
                               D3DFMT_INDEX16 , 
                               D3DPOOL_MANAGED , 
                               &d3dib);// 指定接受制作了的index buffer的指针的指针
                       d3dib->Lock(0 , 0 , &bBuf , 0);
                       memcpy(bBuf , index , sizeof (WORD) * 6);
                       d3dib->Unlock();
 
                       return 0;
               case WM_PAINT:
                       pD3Device->Clear(0 , NULL , D3DCLEAR_TARGET ,
                               D3DCOLOR_XRGB(0xFF , 0xFF , 0xFF) , 1.0 , 0);
                       pD3Device->BeginScene();
                       pD3Device->SetVertexShader(D3DFVF);
                       pD3Device->SetStreamSource(0 , d3dvb , sizeof (D3DVERTEX));
                     // index buffer指定
                     pD3Device->SetIndices(d3dib , 0);
                       //
                       pD3Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST , 0 , 4 , 0 , 2);
                       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);
 
                               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);
 
        while (GetMessage(&msg , NULL , 0 , 0 )) {
               TranslateMessage(&msg);
               DispatchMessage(&msg);
        }
 
        pDirect3D->Release();
        pD3Device->Release();
        return msg.wParam;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值