|
|
我初学D3D,画个空白屏还可以,可是到画线的时候就是老不成功,各位大侠帮我看下问题出在哪里,谢谢了。
原码如下:
#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#define WINDOW_CLASS "UGPDX"
#define WINDOW_NAME "Drawing Lines"
bool InitializeD3D(HWND hWnd,bool fullscreen);
bool InitializeObjects();
void RenderScene();
void Shutdown();
LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_D3DDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer=NULL;
struct stD3DVertex
{
float x,y,z;
DWORD color;
};
#define D3DFVF_VERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
if(wParam==VK_ESCAPE) PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE prevhInst,LPSTR cmdLine,int show)
{
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,hInst,NULL,NULL,NULL,NULL,WINDOW_CLASS,NULL};
RegisterClassEx(&wc);
HWND hWnd=CreateWindow(WINDOW_CLASS,WINDOW_NAME,WS_OVERLAPPEDWINDOW,100,100,640,480,GetDesktopWindow(),NULL,wc.hInstance,NULL);
if(InitializeD3D(hWnd,false))
{
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
RenderScene();
}
}
}
Shutdown();
UnregisterClass(WINDOW_CLASS,wc.hInstance);
return 0;
}
bool InitializeD3D(HWND hWnd,bool fullscreen)
{
D3DDISPLAYMODE displayMode;
g_D3D=Direct3DCreate9(D3D_SDK_VERSION);
if(g_D3D== NULL) return false;
if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode))) return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
if(fullscreen)
{
d3dpp.Windowed=FALSE;
d3dpp.BackBufferWidth=640;
d3dpp.BackBufferHeight=480;
}
else
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=displayMode.Format;
if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_D3DDevice))) return false;
if(!InitializeObjects()) return false;
return true;
}
bool InitializeObjects()
{
DWORD col=D3DCOLOR_XRGB(255,255,255);
stD3DVertex objData[]={{420.5f,150.5f,0.5f,col,},{420.5f,350.5f,0.5f,col,},{220.5f,150.5f,0.5f,col,},{220.5f,350.5f,0.5f,col,},};
if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData),0,D3DFVF_VERTEX,D3DPOOL_DEFAULT,&g_VertexBuffer,NULL))) return false;
void *ptr;
if(FAILED(g_VertexBuffer->Lock(0,sizeof(objData),(void**)&ptr,0))) return false;
memcpy(ptr,objData,sizeof(objData));
g_VertexBuffer->Unlock();
return true;
}
void RenderScene()
{
g_D3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
//-------------------
g_D3DDevice->BeginScene();
g_D3DDevice->SetStreamSource(0,g_VertexBuffer,0,sizeof(stD3DVertex));
g_D3DDevice->SetFVF(D3DFVF_VERTEX);
g_D3DDevice->DrawPrimitive(D3DPT_LINELIST,0,2);
g_D3DDevice->EndScene();
//------------------------
g_D3DDevice-> resent(NULL,NULL,NULL,NULL);
}
void Shutdown()
{
if(g_D3DDevice!=NULL) g_D3DDevice->Release();
if(g_D3D!=NULL) g_D3D->Release();
if(g_VertexBuffer!=NULL) g_VertexBuffer->Release();
g_D3DDevice=NULL;
g_D3D=NULL;
g_VertexBuffer=NULL;
} |
|