菜鸟问题, 解决就给分
火猴 2005-01-10 04:43:06 照书写的例子, <Visual C++ OpenGL DirectX 三维动画编程宝典>D3D部分的第一个例子,为什么三角和方块现实不出来啊?
#include <windows.h>
#include <D3DX8.h>
#include <time.h>
HWND hWnd;
HDC hDC;
HINSTANCE hInstance;
LPDIRECT3D8 P_D3D;
LPDIRECT3DDEVICE8 p_D3DDevice;
RECT rect;
int sw=640;
int sh=480;
bool fullscreen = true;
struct my_vertex{
FLOAT x, y, z, rhw;
DWORD color;
};
#define D3D9T_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
my_vertex g_triangle_vertices[]={
{125.0f, 50.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{200.0f, 200.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{50.0f, 200.0f, 0.5f, 1.0f, 0xFFFFFFFF}
};
my_vertex g_square_vertices[]={
{250.0f, 200.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{250.0f, 50.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{400.0f, 200.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{400.0f, 50.0f, 0.5f, 1.0f, 0xFFFFFFFF}
};
//定点缓冲
IDirect3DVertexBuffer8 *g_triangle=NULL;
IDirect3DVertexBuffer8 *g_square=NULL;
#pragma comment(lib,"d3d8.lib")
#pragma comment(lib,"d3dx8.lib")
int D3DInit()
{
HRESULT hr;
unsigned char *vb_Vertices;
hr=p_D3DDevice->CreateVertexBuffer(3*sizeof(my_vertex),
D3DUSAGE_WRITEONLY,
D3D9T_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_triangle, NULL);
hr=p_D3DDevice->CreateVertexBuffer(4*sizeof(my_vertex),
D3DUSAGE_WRITEONLY,
D3D9T_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_square, NULL );
hr=g_triangle->Lock(0,0,(void **)&vb_Vertices,0);
memcpy(vb_Vertices,g_triangle_vertices, sizeof(g_triangle_vertices));
g_triangle->Unlock();
hr=g_square->Lock(0,0,(void **)&vb_Vertices,0);
memcpy(vb_Vertices,g_square_vertices, sizeof(g_triangle_vertices));
g_square->Unlock();
return 1;
}
D3DFORMAT find_16bit_mode(void){
HRESULT hr;
hr=P_D3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
D3DFMT_R5G6B5, D3DFMT_R5G6B5, false);
if (SUCCEEDED(hr)){
OutputDebugString("D3DFMT_R5G6B5\n");
return D3DFMT_R5G6B5;
}
hr=P_D3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
D3DFMT_X1R5G5B5, D3DFMT_X1R5G5B5, false);
if (SUCCEEDED(hr)){
OutputDebugString("D3DFMT_R5G5B5\n");
return D3DFMT_R5G6B5;
}
return (D3DFORMAT)NULL;
}
void D3DEnable(){
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE display_mode;
P_D3D=Direct3DCreate9(D3D_SDK_VERSION-1);
hr=P_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &display_mode);
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.SwapEffect= D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hWnd;
d3dpp.BackBufferCount=1;
if (fullscreen){
d3dpp.Windowed=false;
d3dpp.BackBufferWidth=sw;
d3dpp.BackBufferHeight=sh;
d3dpp.BackBufferFormat=find_16bit_mode();
}
else
{
d3dpp.Windowed=true;
d3dpp.BackBufferFormat=display_mode.Format;
}
hr=P_D3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&p_D3DDevice);
}
void D3DDisable()
{
if (p_D3DDevice){
p_D3DDevice->Release();
p_D3DDevice=NULL;
}
if(P_D3D){
P_D3D->Release();
P_D3D=NULL;
}
if(g_triangle){
g_triangle->Release();
g_triangle=NULL;
}
if(g_square){
g_square->Release();
g_square=NULL;
}
}
void D3DSceneShow()
{
static unsigned char red=0, green=0, blue=0;
srand( (unsigned)(time(NULL)));
red=rand()%255;
green=rand()%255;
blue=rand()%255;
p_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(red,green,blue),1.0f,0);
if (SUCCEEDED(p_D3DDevice->BeginScene())){
p_D3DDevice->SetStreamSource(0,g_triangle,0,sizeof(my_vertex));
p_D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
p_D3DDevice->SetStreamSource(0,g_square,0,sizeof(my_vertex));
p_D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
p_D3DDevice->EndScene();
}
p_D3DDevice->Present(NULL, NULL, NULL, NULL);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
GetWindowRect(hWnd, &rect);
sw=rect.right-rect.left;
sh=rect.bottom-rect.top;
return 0;
case WM_SIZE:
return 0;
case WM_CLOSE:
ShowWindow(hWnd, SW_HIDE);
PostQuitMessage(0);
return 0;
case WM_DESTROY:
return 0;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
int APIENTRY WinMain(HINSTANCE HiNSTANCE, HINSTANCE HpREViNSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
MSG msg;
bool bQuit=false;
if (MessageBox(NULL, "是否选择全屏现实模式?", "全屏方式运行?", MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=0;
}
wc.style=CS_OWNDC;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="Name";
RegisterClass(&wc);
if (fullscreen)
{
hWnd=CreateWindow("Name",
"Lesson1",
WS_POPUP|WS_CLIPSIBLINGS|WS_VISIBLE,
0, 0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL, NULL,
hInstance,
NULL);
}
else
{
hWnd=CreateWindow("Name",
"Lesson1",
WS_TILEDWINDOW|WS_VISIBLE,
GetSystemMetrics(SM_CXSCREEN)/2-sw/2,
GetSystemMetrics(SM_CYSCREEN)/2-sh/2,
sw,sh,
NULL, NULL,
hInstance,
NULL);
ChangeDisplaySettings(NULL, 0);
}
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
D3DEnable();
D3DInit();
if (!fullscreen)
{
GetWindowRect(hWnd, &rect);
sw=rect.right-rect.left ;
sh=rect.bottom-rect.top;
}
while(!bQuit)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
if (msg.message==WM_QUIT)
bQuit=true;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
D3DSceneShow();
}
}
D3DDisable();
ShowWindow(hWnd, SW_HIDE);
DestroyWindow(hWnd);
ChangeDisplaySettings(NULL, 0);
return msg.wParam ;
return 0;
}