|
|
我想使用光照,可是运行程序的时候三棱锥总是黑色的,请问各位高手,怎么回事?谢谢
#include<d3d9.h>
#include<d3dx9.h>
//声明全局变量
LPDIRECT3D9 g_pD3D=NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;
//顶点结构
struct CUSTOMVERTEX
{
FLOAT x,y,z;
FLOAT nx,ny,nz;
};
//标志定点FVF
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
//初始化D3D
HRESULT InitD3D(HWND hwnd)
{
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=true;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pD3DDevice);
g_pD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);
g_pD3DDevice->SetRenderState(D3DRS_CULLMODE , D3DCULL_NONE);
return S_OK;
}
void SetLight()
{
D3DXVECTOR3 vecDir;
// 创建一个平行光
D3DLIGHT9 light;
ZeroMemory( & light, sizeof (D3DLIGHT9) );
light.Type = D3DLIGHT_DIRECTIONAL; // 平行光
light.Diffuse.r = 0.0f ;
light.Diffuse.g = 1.0f ; // 红色
light.Diffuse.b = 0.0f ;
vecDir = D3DXVECTOR3( 10 , 10 , - 10 ); // 方向是从0,0,0指向10,10,-10
D3DXVec3Normalize( (D3DXVECTOR3 * ) & light.Direction, & vecDir );
// 设置0号光照为此灯光参数
g_pD3DDevice -> SetLight( 0 , & light );
// 开启0号光照
g_pD3DDevice -> LightEnable( 0 , TRUE );
// 开启光照系统
g_pD3DDevice -> SetRenderState( D3DRS_LIGHTING, TRUE );
}
void SetMaterial()
{
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));
mtrl.Diffuse.r=mtrl.Ambient.r=1.0f;
mtrl.Diffuse.g=mtrl.Ambient.g=1.5f;
mtrl.Diffuse.b=mtrl.Ambient.b=0.0f;
mtrl.Diffuse.a=mtrl.Ambient.a=1.0f;
mtrl.Power=0;
g_pD3DDevice->SetMaterial(&mtrl);
}
//初始化绘图
HRESULT InitDraw()
{
g_pD3DDevice->CreateVertexBuffer(
12*sizeof(CUSTOMVERTEX),
D3DUSAGE_WRITEONLY,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_pVB,NULL
);
CUSTOMVERTEX vertertex[]=
{
{ 0.0f,1.0f,0.0f }, // 0
{ 1.0f, -1.0f,-0.577f }, // 2
{ -1.0f, -1.0f,-0.577f }, // 1
{ 0.0f,1.0f,0.0f }, // 0
{ 0.0f,-1.0f,1.155f } , // 3
{ 1.0f, -1.0f,-0.577f }, // 2
{ 0.0f,1.0f,0.0f }, // 0
{ -1.0f, -1.0f,-0.577f }, // 1
{ 0.0f,-1.0f,1.155f } , // 3
{ -1.0f, -1.0f,-0.577f }, // 1
{ 1.0f, -1.0f,-0.577f }, // 2
{ 0.0f,-1.0f,1.155f } , // 3
};
VOID *pVertices;
g_pVB->Lock(0,sizeof(vertertex),(void**)&pVertices,0);
memcpy(pVertices,vertertex,sizeof(vertertex));
g_pVB->Unlock();
return S_OK;
}
//设置变换矩阵
void SetupMatrices()
{
D3DXMATRIX WorldMatrix;
D3DXMatrixRotationY(&WorldMatrix,timeGetTime()/500.0f );
g_pD3DDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);
D3DXVECTOR3 position(5.0f,3.0f,-10.0f);
D3DXVECTOR3 targetPoint(0.0f,0.0f,0.0f);
D3DXVECTOR3 worldUp(0.0f,1.0f,0.0f);
D3DXMATRIX view;
D3DXMatrixLookAtLH(&view,&position,&targetPoint,&worldUp);
g_pD3DDevice->SetTransform(D3DTS_VIEW,&view);
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI/4,1024/768,1.0f,100.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&proj);
}
//渲染
void Render()
{
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
g_pD3DDevice->BeginScene();
SetupMatrices();
SetLight();
SetMaterial();
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);
}
//清除
void CleanUp()
{
if(NULL!=g_pVB)
{
g_pVB->Release();
}
if(NULL!=g_pD3DDevice)
{
g_pD3DDevice->Release();
}
if(NULL!=g_pD3D)
{
g_pD3D->Release();
}
}
//窗口回调函数
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//主函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)
{
WNDCLASS window;
window.cbClsExtra=0;
window.cbWndExtra=0;
window.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
window.hCursor=LoadCursor(NULL,IDC_ARROW);
window.hIcon=LoadIcon(NULL,IDI_APPLICATION);
window.hInstance=hInstance;
window.lpfnWndProc=WindowProc;
window.lpszClassName="newclass";
window.lpszMenuName=NULL;
window.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&window);//注册窗口
//创建窗口
HWND hwnd;
hwnd=CreateWindow("newclass",
"window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
InitD3D(hwnd);
InitDraw();
//SHOWWINDOW
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
//消息循环
MSG msg;
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
CleanUp();
return msg.wParam;
}
|
|