⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 使用shader语言在vs阶段编写光照效果的演示程序及全部源代码
💻 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 + -