|
发表于 2010-4-23 01:47:00
|
显示全部楼层
Re:按照书本打的D3D程序~居然显示不出图形来?
我把光照光了怎么就行了?
一切正常却看不到东西,一个原因是光照开着;还有一个原因是灯光材质设得有问题,比如设之前没清零。
// D3D rectangle.cpp : 定义应用程序的入口点。
//目的:演示三维坐标变换
#include <d3d9.h>
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9math.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;//顶点缓冲区指针
HWND g_Wnd = NULL;
struct CUSTOMVERTEX
{
D3DXVECTOR3 position;
DWORD color;
};
HRESULT InitD3D(HWND hWnd)
{
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = true ;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
{
return E_FAIL;
}
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);// 多了这里
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);
return S_OK;
}
HRESULT InitGeometry()
{
if(FAILED(g_pd3dDevice->CreateVertexBuffer(50*2*sizeof(CUSTOMVERTEX),
0,D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT,&g_pVB,NULL)))
{
return E_FAIL;
}
CUSTOMVERTEX* pVertices;
if(FAILED(g_pVB->Lock(0,0,(void**)&pVertices,0)))
return E_FAIL;
for(DWORD i = 0;i < 50;i ++)
{
FLOAT theta = (2*D3DX_PI*i)/(50-1);
pVertices[2 * i + 0].position = D3DXVECTOR3(sinf(theta),-1.0f,cosf(theta));
pVertices[2 * i + 0].color = 0xff0000ff;
pVertices[2 * i + 1].position = D3DXVECTOR3(sinf(theta), 1.0f,cosf(theta));
pVertices[2 * i + 1].color = 0xff0000ff;
}
g_pVB->Unlock();
return S_OK;
}
VOID Cleanup()
{
if(g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if(g_pD3D != NULL)
g_pD3D->Release();
if(g_pVB != NULL)
g_pVB->Release();
}
VOID SetupMatrices()
{
D3DXMATRIXA16 matWorld;
UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
D3DXMatrixRotationX(&matWorld,fAngle);
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
// 建立一个观察矩阵
D3DXVECTOR3 vEyePt(0.0f , 3.0f , -5.0f);
D3DXVECTOR3 vLookatPt(0.0f , 0.0f , 0.0f);
D3DXVECTOR3 vUpVec(0.0f , 1.0f , 0.0f);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);
// 建立一个透视投影矩阵
D3DXMATRIXA16 matProj;
//D3DXMatrixLookAtLH(&matProj,&vEyePt,&vLookatPt,&vUpVec);
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI / 4,1.0f,1.0f,100.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
// 设置视区
RECT rect;
GetClientRect(g_Wnd,&rect);
D3DVIEWPORT9 vp;
vp.X = 0;
vp.Y = 0;
vp.Width = rect.right;
vp.Height = rect.bottom;
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
g_pd3dDevice->SetViewport(&vp);
}
VOID Render()
{
/*if(NULL == g_pd3dDevice)
return;*/
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
//g_pd3dDevice->BeginScene();
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
SetupMatrices();
g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2 * 50 - 2);
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:
Cleanup();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
//应用程序入口
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
// 注册窗口类
//WNDCLASS wndclass = {0,MsgProc,0L,0L,hInst,
//NULL,NULL,NULL,NULL,L"D3D zengraoli"};
WNDCLASS wndclass = {CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,L"D3D zengraoli"};
RegisterClass(&wndclass);
HWND hWnd = CreateWindow(L"D3D zengraoli",L"D3D zengraoli:CreateDevice",
WS_OVERLAPPEDWINDOW,100,100,300,300,GetDesktopWindow(),NULL,wndclass.hInstance,NULL);
g_Wnd = hWnd;
if(SUCCEEDED(InitD3D(hWnd)))
{
if(SUCCEEDED(InitGeometry()))
{
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
Render();
}
}
}
UnregisterClass(L"D3D Tutorial",wndclass.hInstance);
return 0;
} |
|