我刚学这个directx 把以前的缓冲区 改成了索引缓冲区就不行了 出来的就画不出东西啊 高手们帮我调下程序嘛 88至99行我感觉很有问题!高手们 跪求指点迷津
#include<d3d9.h>
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;
LPDIRECT3DINDEXBUFFER9 g_pVertexBuffer = NULL;
struct CUSTOMVERTEX
{
FLOAT x,y,z;
DWORD colour;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)#define SafeRelease(pObject) if (pObject != NULL) {pObject -> Release();pObject = NULL;}HRESULT InitialiseD3D(HWND hWnd)
{
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D == NULL)
{
return E_FAIL;
}
D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3D ->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
return E_FAIL;
} D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY;
d3dpp.BackBufferFormat = d3ddm.Format; if(FAILED(g_pD3D ->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
{
return E_FAIL;
}
return S_OK;
}HRESULT InitialiseVertexBuffer()
{
// VOID *pVertices;
WORD *pVertices; CUSTOMVERTEX cvVertices[]=
{
{-1.0f,-1.0f,0.0f,0Xffff0000},//红色
{1.0f,-1.0f,0.0f,0Xff0000ff},//蓝色
{1.0f,0.0f,0.0f,0Xff00ff00},//绿色
{0.0f,1.0f,0.0f,0Xffff00ff},//洋红
{-1.0f,0.0f,0.0f,0Xffffffff},//白色
}; if(FAILED(g_pD3DDevice->CreateIndexBuffer(6 * sizeof(WORD),0,D3DFMT_INDEX16,
D3DPOOL_DEFAULT,&g_pVertexBuffer,NULL)))//创建索引缓冲区 {
return E_FAIL;
} if(FAILED(g_pVertexBuffer->Lock(0,12,(void **)&pVertices,0)))
{
return E_FAIL;
}// memcpy(pVertices,cvVertices,sizeof(cvVertices));
pVertices[0] = 0;
pVertices[1] = 1;
pVertices[2] = 2;
pVertices[3] = 0;
pVertices[4] = 3;
pVertices[5] = 4; g_pVertexBuffer->Unlock(); return S_OK;
}
void Render()
{
if(g_pD3DDevice == NULL)
{
return;
} g_pD3DDevice ->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0); g_pD3DDevice ->BeginScene(); g_pD3DDevice ->SetStreamSource(0,(IDirect3DVertexBuffer9 *)g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));
g_pD3DDevice ->SetIndices(g_pVertexBuffer);
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice ->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,5,0,2,0); g_pD3DDevice ->EndScene(); g_pD3DDevice ->Present(NULL,NULL,NULL,NULL);
}void CleanUp()
{
SafeRelease(::g_pVertexBuffer);
SafeRelease(::g_pD3DDevice);
SafeRelease(::g_pD3D);
}void GameLoop()
{
MSG msg;
BOOL fMessage; PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE); while(msg.message != WM_QUIT)
{
fMessage = PeekMessage(&msg,NULL,0U,0U,PM_REMOVE); if(fMessage)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
::Render();
}
}
}LRESULT WINAPI WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
::PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
switch(wParam)
{
case VK_ESCAPE:
::DestroyWindow(hWnd);
return 0;
break;
}
break;
}
return ::DefWindowProc(hWnd,msg,wParam,lParam);
}INT WINAPI WinMain(::HINSTANCE hInst,::HINSTANCE,::LPSTR,INT)
{
::WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
"DX 三角形",NULL};
::RegisterClassEx(&wc); HWND hWnd = CreateWindow("DX 三角形","索引顶点",WS_OVERLAPPEDWINDOW,50,50,500,500,
GetDesktopWindow(),NULL,wc.hInstance,NULL); if(SUCCEEDED(InitialiseD3D(hWnd)))
{
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd); if(SUCCEEDED(InitialiseVertexBuffer()))
{
GameLoop();
}
} CleanUp(); UnregisterClass("DX 三角形",wc.hInstance); return 0;
}