|
图象在附件里,源程如下(VC6 DX9sdk 通过)
#include<Windows.h>
#include<d3d9.h>
#include<d3dx9.h>
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
struct CUSTOMVERTEX
{
D3DXVECTOR3 position;
D3DXVECTOR3 normal;
};
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
HRESULT InitD3D(HWND hWnd)
{
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
D3DDISPLAYMODE d3ddm;
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm);
D3DPRESENT_PARAMETERS stPresentParam;
ZeroMemory(&stPresentParam,sizeof(stPresentParam));
stPresentParam.Windowed=TRUE;
stPresentParam.SwapEffect=D3DSWAPEFFECT_DISCARD;
stPresentParam.BackBufferFormat=d3ddm.Format;
stPresentParam.EnableAutoDepthStencil=FALSE; // 就是这行,如果打开(TRUE)就不正常了
stPresentParam.AutoDepthStencilFormat=D3DFMT_D16;
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&stPresentParam,&g_pD3DDevice);
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
g_pD3DDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
return S_OK;
}
HRESULT InitVB()
{
g_pD3DDevice->CreateVertexBuffer(36*sizeof(CUSTOMVERTEX),
0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL);
CUSTOMVERTEX *pVertices;
g_pVB->Lock(0,0,(void**)&pVertices,0);
pVertices[0].position = D3DXVECTOR3(-1.0f,1.0f,-1.0f);
pVertices[0].normal = D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertices[1].position = D3DXVECTOR3( 1.0f,1.0f,-1.0f);
pVertices[1].normal = D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertices[2].position = D3DXVECTOR3(-1.0f,-1.0f,-1.0f);
pVertices[2].normal = D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertices[3].position = D3DXVECTOR3( 1.0f,1.0f,-1.0f);
pVertices[3].normal = D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertices[4].position = D3DXVECTOR3( 1.0f,-1.0f,-1.0f);
pVertices[4].normal = D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertices[5].position = D3DXVECTOR3(-1.0f,-1.0f,-1.0f);
pVertices[5].normal = D3DXVECTOR3(0.0f,0.0f,-1.0f);
pVertices[6].position = D3DXVECTOR3( 1.0f,1.0f,-1.0f);
pVertices[6].normal = D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertices[7].position = D3DXVECTOR3( 1.0f,-1.0f,1.0f);
pVertices[7].normal = D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertices[8].position = D3DXVECTOR3( 1.0f,-1.0f,-1.0f);
pVertices[8].normal = D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertices[9].position = D3DXVECTOR3( 1.0f,1.0f,-1.0f);
pVertices[9].normal = D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertices[10].position = D3DXVECTOR3( 1.0f,1.0f,1.0f);
pVertices[10].normal = D3DXVECTOR3(1.0f,0.0f,0.0f);
pVertices[11].position = D3DXVECTOR3( 1.0f,-1.0f,1.0f);
pVertices[11].normal = D3DXVECTOR3(1.0f,0.0f,0.0f);
g_pVB->Unlock();
return S_OK;
}
void SetupMatrices()
{
D3DXMATRIXA16 matWorld;
D3DXMatrixIdentity(&matWorld);
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
D3DXVECTOR3 vE(5.0f,3.0f,-5.0f);
D3DXVECTOR3 vL(0.0f,0.0f,0.0f);
D3DXVECTOR3 vU(0.0f,1.0f,0.0f);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView,&vE,&vL,&vU);
g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);
D3DXMATRIXA16 matProject;
D3DXMatrixPerspectiveFovLH(&matProject,D3DX_PI/4,1.0f,1.0f,100.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProject);
}
void SetLights()
{
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
g_pD3DDevice->SetMaterial(&mtrl);
D3DXVECTOR3 vecDir;
D3DLIGHT9 light;
ZeroMemory( &light, sizeof(D3DLIGHT9) );
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse.r = 0.0f;
light.Diffuse.g = 0.4f;
light.Diffuse.b = 0.0f;
vecDir = D3DXVECTOR3(-10,0,5);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
light.Range = 1000.0f;
g_pD3DDevice->SetLight( 0, &light );
g_pD3DDevice->LightEnable( 0, TRUE );
g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
D3DXVECTOR3 vecPos;
D3DLIGHT9 light2;
ZeroMemory(&light2,sizeof(D3DLIGHT9));
light2.Type = D3DLIGHT_POINT;
light2.Diffuse.r = 0.9f;
light2.Diffuse.g = 0.0f;
light2.Diffuse.b = 0.0f;
light2.Position = D3DXVECTOR3(5.0f,2.0f,-3.0f);
vecDir = D3DXVECTOR3(-10,0,10);
D3DXVec3Normalize( (D3DXVECTOR3*)&light2.Direction, &vecDir );
light2.Falloff = 1.0f;
light2.Range = 100.0f;
light2.Attenuation0 = 1.0f;
light2.Theta = 2*D3DX_PI*5/360;
light2.Phi = 2*D3DX_PI*50/360;
g_pD3DDevice->SetLight(1,&light2);
g_pD3DDevice->LightEnable(1,TRUE);
g_pD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
g_pD3DDevice->SetRenderState(D3DRS_AMBIENT,0x00202020);
}
void Render()
{
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_ARGB(0,0,0,100),1.0f,0);
if (SUCCEEDED(g_pD3DDevice->BeginScene()))
{
SetLights();
SetupMatrices();
g_pD3DDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,4);
g_pD3DDevice->EndScene();
}
g_pD3DDevice-> resent(NULL,NULL,NULL,NULL);
}
LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
ValidateRect(hWnd,NULL);
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
WNDCLASS MyWindow={CS_SAVEBITS,MsgProc,0L,0L,hInst,NULL,NULL,NULL,NULL,"MW"};
RegisterClass(&MyWindow);
HWND hWnd=CreateWindow("MW","Milk's Window",
WS_SIZEBOX | WS_MINIMIZEBOX | WS_OVERLAPPEDWINDOW & WS_SYSMENU,
100,100,400,400,GetDesktopWindow(),NULL,MyWindow.hInstance,NULL);
InitD3D(hWnd);
InitVB();
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
Render();
TranslateMessage(&msg);
DispatchMessage(&msg);
}
g_pVB->Release();
g_pD3DDevice->Release();
g_pD3D->Release();
UnregisterClass("MW",MyWindow.hInstance );
return 0;
}
[em24] [em24] |
-
|