|
|

楼主 |
发表于 2005-10-11 18:23:00
|
显示全部楼层
Re:请教问题.....
#include<d3d9.h>
#include<d3dx9math.h>
#pragma comment(lib,"D3DX9.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"D3D9.lib")
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
#define SafeRelease(pObject) if(pObject != NULL) {pObject->Release(); pObject=NULL;}
//D3D对象
LPDIRECT3D9 g_pD3D=NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL; //D3D设备
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 顶点缓冲区指针
LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer = NULL; // 索引缓冲区指针
/*D3DXVECTOR3 Eye;
D3DXVECTOR3 LookAt;
D3DXVECTOR3 Up;
*/
struct CUSTOMVERTEX
{
FLOAT x,y,z; //Position
DWORD color; //Color
};
HRESULT InitD3D(HWND hWnd)
{
//第2步 建立D3D对象
if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
{
/* MessageBox( HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType);*/
MessageBox(NULL,"建立D3D对象错误","miss",MB_OK);
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_FLIP ;
d3dpp.BackBufferFormat=d3ddm.Format;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
//Create the D3DDevice
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT ,
D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pd3dDevice)))
{
MessageBox(NULL,"建立D3D设备错误","miss",MB_OK);
return E_FAIL;
}
return S_OK;
}
//初始化顶点信息
HRESULT InitIB()
{
CUSTOMVERTEX g_Vertices[] =
{ { 50.0f, 50.0f, 0.5f, D3DCOLOR_XRGB(255, 0, 0), },
{ 250.0f, 250.0f, 0.5f, D3DCOLOR_XRGB(0, 255, 0), },
{ 50.0f , 250.0f, 0.5f, D3DCOLOR_XRGB(0, 0, 255), },
{ 250.0f, 50.0f, 0.5f, D3DCOLOR_XRGB(255, 0, 0), },
};
//创建顶点缓冲区
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB,NULL ) ) )
{
return E_FAIL;
}
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (VOID**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
g_pVB->Unlock();
//Create index buffer 创建索引缓冲
if(FAILED(g_pd3dDevice->CreateIndexBuffer(sizeof(short)*6,
0,D3DFMT_INDEX16,
D3DPOOL_SYSTEMMEM ,&g_pIndexBuffer,NULL)))
{
MessageBox(NULL,"建立索引缓冲错误","miss",MB_OK);
return E_FAIL;
}
//Fill index buffer
short Indices[6]=
{
0,1,2,
3,1,0
};
VOID* IndexData =NULL;
if(SUCCEEDED(g_pIndexBuffer->Lock(0,0,&IndexData,0)))
{
memcpy(IndexData,(void*)&Indices,sizeof(Indices));
g_pIndexBuffer->Unlock();
}
return S_OK;
}
void Cleanup()
{
SafeRelease(g_pVB);
SafeRelease(g_pd3dDevice);
SafeRelease(g_pD3D);
}
void Render();
void GameLoop()
{
MSG msg;
BOOL fMessage;
PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);
if(g_pd3dDevice=NULL)
{
MessageBox(NULL,"空设备,循环不能进行","miss",MB_OK);
return;
}
while(msg.message !=WM_QUIT)
{
fMessage=PeekMessage(&msg,NULL,0U,0U,PM_REMOVE);
if(fMessage)
{
//Process message
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
//The windows message handler
LRESULT WINAPI MsgProc(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:
//User has pressed the escape key, so quit
DestroyWindow(hWnd);
return 0;
break;
}
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
//第1步 建立窗口对象和窗体 Register the window class
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style =CS_CLASSDC;
wc.lpfnWndProc =MsgProc;
wc.cbClsExtra =0;
wc.cbWndExtra =0;
wc.hInstance=GetModuleHandle(NULL);
wc.lpszClassName=TEXT("WindowClass");
wc.hbrBackground =NULL;
wc.hCursor =NULL;
wc.hIcon =NULL;
wc.hIconSm =NULL;
wc.lpszMenuName =NULL;
RegisterClassEx(&wc);
//Create the application's window
HWND hWnd =CreateWindow(TEXT("WindowClass"),TEXT("Test"),WS_OVERLAPPEDWINDOW,
100,100,512,512,GetDesktopWindow(),NULL,wc.hInstance ,NULL);
//Initialize Direct3D
if(SUCCEEDED(InitD3D(hWnd)))
{
//Show our window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//Initialize Vertex Buffer
if(SUCCEEDED(InitIB()))
{
//Start game running: Enter the game loop
GameLoop();
}
}
Cleanup();
UnregisterClass( "WindowClass", wc.hInstance );
return 0;
}
void Render()
{
if(g_pd3dDevice == NULL)
{
MessageBox(NULL,"空设备,渲染不能进行","miss",MB_OK);
return;
}
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
g_pd3dDevice->BeginScene();
/* //Set the matricse
//世界空间
D3DXMATRIX g_Transform;
//每帧物体绕Y轴旋转
UINT iTime=timeGetTime();
FLOAT fAngle=iTime*(2.0f*D3DX_PI)/1000.f;
D3DXMatrixRotationY(&g_Transform,fAngle);
g_pd3dDevice->SetTransform(D3DTS_WORLD,&g_Transform);
//视图空间
D3DXMATRIX g_View;
D3DXVECTOR3 Eye(0.0f,-5.0f,0.0f);
D3DXVECTOR3 LookAt(0.0f,0.0f,0.0f);
D3DXVECTOR3 Up(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&g_View,&Eye,&LookAt,&Up);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&g_View);
//视口空间
D3DXMATRIX Projection;
FLOAT FOV=D3DX_PI/4;
D3DXMatrixPerspectiveFovLH(& rojection,FOV, 1.0f, 1.0f, 500.0f);
//D3DXMatrixPerspectiveFovLH(&Projection,FOV,Aspect,1.0f,500.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&Projection);
*/
g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetIndices(g_pIndexBuffer);
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawIndexedPrimitive ( D3DPT_TRIANGLELIST ,
0, //INT BaseVertexIndex
0, //UINT MinIndex
4, //UINT NumVertices
0, //UNIT StartIndex
2); //PrimitiveCount
// g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST ,0,1);
//End the scene
g_pd3dDevice->EndScene();
//Present the back buffer contents to the display
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
OK,现在我发现了问题,在Render()函数里, g_pd3dDevice居然为空,但我反复检查代码,没有发现有哪个地方把它释放掉啊? g_pd3dDevice为一个全局变量. 这到底是怎么回事呢?? 真奇怪,
有哪个高手能帮我解决一下吗? 急死我了........ |
|