📄 main.cpp
字号:
#include "D3DBase.h"
#include "mesh.h"
#include "Camera.h"
#include "Mesh.h"
#include "D3DShader.h"
#include "FXShader.h"
class CBasicD3DApp : public CD3DApplication
{
CD3DMesh m_Mesh;
D3DLIGHT9 m_Light;
CEffectShader m_FXShader;
XCamera m_Camera;
bool GetModelFile(char* file_name);
public:
CBasicD3DApp()
{
}
void createLight();
void setupLight();
void createGeometry();
void destoryGeometry();
void setFog();
void onRender(long passedTime);
LONG onWndMessage(UINT msg,WPARAM wParam,LPARAM lParam);
};
void CBasicD3DApp::setupLight()
{
m_pD3DDevice->SetLight(0,&m_Light);
m_pD3DDevice->LightEnable(0,TRUE);
m_pD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
}
void CBasicD3DApp::createLight()
{
//创建光源
ZeroMemory( &m_Light, sizeof(m_Light) );
m_Light.Type = D3DLIGHT_DIRECTIONAL;
m_Light.Diffuse.r = 1.0f;
m_Light.Diffuse.g = 1.0f;
m_Light.Diffuse.b = 1.0f;
D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(1.0,-1.0f,1.0f );
D3DXVec3Normalize( (D3DXVECTOR3*)&m_Light.Direction, &vecDir );
m_Light.Range = 1000.0f;
}
bool CBasicD3DApp::GetModelFile(char* file_name)
{
OPENFILENAME ofn;
file_name[0] =0;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = GetActiveWindow();
ofn.lpstrFile = file_name;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = "模型文件(*.model)\0*.model\0所有文件(*.*)\0*.*\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.lpstrDefExt = "model";
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileName(&ofn) == FALSE)
{
return false;
}
return true;
}
void CBasicD3DApp::createGeometry()
{
m_Mesh.load("teapot.mesh");
m_Mesh.loadTexture("teapot.jpg");
m_FXShader.load("simpVSlighting.fx");
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXVECTOR3 at = (m_Mesh.m_VertexMax + m_Mesh.m_VertexMin) / 2.0f;
D3DXVECTOR3 eye = at;;
eye.x = eye.z - 2.0f * (m_Mesh.m_VertexMax.z - m_Mesh.m_VertexMin.z);
m_Camera.m_Eye.m_EyePos = eye;
m_Camera.m_Eye.m_Up = up;
m_Camera.m_Eye.m_EyeTarget = at;
m_Camera.setAspect( 4.0f/3.0f);
m_Camera.setFarPlan(2000.0f);
m_Camera.setNearPlan(0.1f);
m_Camera.setFOV(60.0f * 3.14f/180.0f);
setFog();
createLight();
}
void CBasicD3DApp::destoryGeometry()
{
m_Mesh.release();
m_FXShader.unload();
}
void CBasicD3DApp::setFog()
{
m_pD3DDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_LINEAR);
float fFogStart = 5.0f;
float fFogEnd = 140.0f;
m_pD3DDevice->SetRenderState(D3DRS_FOGSTART, *((DWORD*) (&fFogStart)));
m_pD3DDevice->SetRenderState(D3DRS_FOGEND, *((DWORD*) (&fFogEnd)));
m_pD3DDevice->SetRenderState(D3DRS_FOGCOLOR,0Xffffffff);
m_pD3DDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
}
void CBasicD3DApp::onRender(long passedTime)
{
Sleep(10);
m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,TRUE);
D3DXMatrixIdentity(&m_WorldMatrix);
m_pD3DDevice->SetTransform(D3DTS_WORLD,&m_WorldMatrix);
m_Camera.applyCamera();
m_Camera.applyProjection();
m_pD3DDevice->BeginScene();
m_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0xff000077,1.0f,0);
setFog();
setupLight();
m_pD3DDevice->SetRenderState(D3DRS_FOGENABLE,FALSE);
long t = GetTickCount();
D3DXMATRIX wrlMat , viewMat , projMat,matWorldViewProj;
D3DXMATRIX wrlView;
{
m_Mesh.getTransform(&wrlMat);
m_pD3DDevice->GetTransform(D3DTS_VIEW,&viewMat);
m_pD3DDevice->GetTransform(D3DTS_PROJECTION,&projMat);
wrlView = wrlMat*viewMat;
matWorldViewProj = wrlMat*viewMat*projMat;
wrlView._41 = wrlView._42 = wrlView._43 = 0.0f;
m_FXShader.setParamValue("worldViewProj" ,&matWorldViewProj);
m_FXShader.setParamValue("normalMat" ,&wrlView);
m_FXShader.setTexture("diffuseTexture", m_Mesh.m_pTexture);
size_t nPass = 0;
m_FXShader.setTechnique("textured");
m_FXShader.begin(&nPass,0);
for(int i = 0 ;i < nPass ; ++i)
{
m_FXShader.beginPass(i);
m_Mesh.render(passedTime);
m_FXShader.endPass();
}
m_FXShader.end();
}
m_pD3DDevice->EndScene();
m_pD3DDevice->Present(NULL,NULL,NULL,NULL);
}
LONG CBasicD3DApp::onWndMessage(UINT msg,WPARAM wParam,LPARAM lParam)
{
static POINT oldPoint;
static bool bIsMouseDown = false;
switch(msg)
{
case WM_LBUTTONDOWN:
bIsMouseDown = true;
oldPoint.x = LOWORD(lParam);
oldPoint.y = HIWORD(lParam);
SetCapture(m_hMainWnd);
break;
case WM_LBUTTONUP:
bIsMouseDown = false;
ReleaseCapture();
break;
case WM_MOUSEMOVE:
{
if(bIsMouseDown == false) break;
float dx = LOWORD(lParam) - oldPoint.x ;
float dy = HIWORD(lParam) - oldPoint.y ;
oldPoint.x = LOWORD(lParam);
oldPoint.y = HIWORD(lParam);
m_Mesh.rotate(-dx/80.0f,0.0f, dy / 80.f);
}
break;
case WM_KEYDOWN:
switch(wParam)
{
case 'F':
m_pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
break;
case 'C':
m_pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
break;
case 'A':
//case 'a':
m_Camera.yaw(-3.0f * 3.14f/180.f);
break;
case 'D':
//case 'd':
m_Camera.yaw(3.0f * 3.14f/180.f);
break;
case 'W':
//case 'w':
case VK_UP:
m_Camera.toward(1.5f);
break;
case 'S':
//case 's':
case VK_DOWN:
m_Camera.toward(-1.5f);
break;
case VK_SHIFT:
m_Camera.upDown(1.5f);
return 0;
break;
case VK_CONTROL:
m_Camera.upDown(-1.5f);
return 0;
break;
case VK_INSERT:
m_Camera.pitch(3.0f * 3.14f/180.f);
break;
case VK_DELETE:
m_Camera.pitch(-3.0f * 3.14f/180.f);
break;
case VK_HOME:
m_Camera.yaw(3.0f * 3.14f/180.f);
break;
case VK_END:
m_Camera.yaw(-3.0f * 3.14f/180.f);
break;
case VK_LEFT:
m_Camera.circle(3.0f * 3.14f/180.f);
break;
case VK_RIGHT:
m_Camera.circle(-3.0f * 3.14f/180.f);
break;
}
break;
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_DESTROY:
CloseWindow(m_hMainWnd);
break;
default:
return (LONG)::DefWindowProc(m_hMainWnd,msg,wParam,lParam); ;
}
return 0;
}
INT _stdcall WinMain(HINSTANCE hInstance , HINSTANCE, LPSTR lpCmdLine , int nShowCmd)
{
CBasicD3DApp app;
app.create(800,600,"简单灯光效果",false);
app.createdevice(800,600);
app.createGeometry();
app.loop();
app.destoryGeometry();
app.destoryApp();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -