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

📄 d3dbase.cpp

📁 使用shader语言在vs阶段编写光照效果的演示程序及全部源代码
💻 CPP
字号:
#include "D3DBase.h"
CD3DApplication* CD3DApplication::m_pApp = NULL;
CD3DApplication::CD3DApplication()
{
	this->m_Height      = 480;
	this->m_Width       = 640;
	this->m_pApp        = this;
	this->m_pD3D9Object = NULL;
	this->m_pD3DDevice  = NULL;
	this->m_hMainWnd    = NULL;
}

bool CD3DApplication::create(int Width,int Height, const char* appTitle,bool fullScreen)
{
	m_isFullScreen = fullScreen;
	WNDCLASSEX  wndclass ;
	wndclass.cbSize        = sizeof (wndclass) ;


	DWORD wndStyle = WS_POPUP;

	if(fullScreen == true)
	{
		wndStyle = WS_POPUP;
	}
	else
	{
		wndStyle = WS_OVERLAPPEDWINDOW;
	}

	wndclass.style         = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc   = CD3DApplication::windowProc;
	wndclass.cbClsExtra    = 0 ;
	wndclass.cbWndExtra    = 0 ;
	wndclass.hInstance     = GetModuleHandle(NULL);
	wndclass.hIcon         = LoadIcon(NULL,IDI_APPLICATION) ;// (wndclass.hInstance, MAKEINTRESOURCE(IDI_DGE) ) ;
	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
	
	LOGBRUSH longBrush =
	{
		BS_SOLID,RGB(255,255,255),0
	};

	wndclass.hbrBackground = CreateBrushIndirect(&longBrush);//(HBRUSH) GetStockObject(BLACK_BRUSH) ;



	wndclass.lpszMenuName  = NULL;
	wndclass.lpszClassName = "D3DCreateWnd"; 
	wndclass.hIconSm       = LoadIcon(NULL,IDI_APPLICATION);//(wndclass.hInstance, MAKEINTRESOURCE(IDI_DGE) ) ;

	// Register the class
	RegisterClassEx(&wndclass);


	// Create a window
	HWND hWnd = CreateWindowEx(
		0,  // Extended style
		wndclass.lpszClassName,
		appTitle,
		wndStyle,       // Window style
		0,              // Horizontal origin  
		0,              // Vertical origin
		Width,//GetSystemMetrics(SM_CXSCREEN), // x size
		Height,//GetSystemMetrics(SM_CYSCREEN), // y size
		NULL,            // Handle of parent
		NULL,            // Handle to menu
		wndclass.hInstance,//hInstance,       // Application instance
		NULL);           // Additional data

	if (!hWnd)
	{
		return NULL;
	}

	m_hMainWnd = hWnd;

	::ShowWindow(hWnd,SW_SHOW);

	return hWnd != NULL;   
}

bool CD3DApplication::createdevice(int bufferWidht, int bufferHeight)
{
	if(m_hMainWnd == NULL)
		return NULL;

	m_pD3D9Object = Direct3DCreate9(D3D_SDK_VERSION);
	if(NULL == m_pD3D9Object)
		return false;

	m_isFullScreen = false;
	m_DepthStencilFormat = D3DFMT_D16;
	m_BackBufferFormat = D3DFMT_X8R8G8B8;

	D3DDISPLAYMODE d3dm;
	if(FAILED(m_pD3D9Object->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3dm) ))
	{
		return NULL;
	}

	//Now Check the depth - Stencil buffer format
	HRESULT hr = m_pD3D9Object->CheckDeviceFormat( D3DADAPTER_DEFAULT,
		D3DDEVTYPE_HAL,
		m_BackBufferFormat,
		D3DUSAGE_DEPTHSTENCIL,
		D3DRTYPE_SURFACE,
		m_DepthStencilFormat);

	if(FAILED(hr))
		return NULL;

	hr = m_pD3D9Object->CheckDepthStencilMatch(D3DADAPTER_DEFAULT,
		D3DDEVTYPE_HAL,m_BackBufferFormat,
		m_BackBufferFormat,m_DepthStencilFormat) ;


	if( !SUCCEEDED(hr))
		return NULL;

	//Now prepaire to create the D3D Device;
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory( &d3dpp, sizeof(d3dpp) );
	d3dpp.BackBufferCount = 1;
	d3dpp.hDeviceWindow = m_hMainWnd;
	d3dpp.BackBufferWidth = bufferWidht;
	d3dpp.BackBufferHeight = bufferHeight;
	d3dpp.BackBufferFormat = m_BackBufferFormat;
	if(m_isFullScreen)
	{
		d3dpp.FullScreen_RefreshRateInHz = d3dm.RefreshRate;
		if(FAILED(m_pD3D9Object->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,d3dpp.BackBufferFormat,d3dpp.BackBufferFormat,TRUE)))
		{
			return NULL;
		}
	}


	d3dpp.AutoDepthStencilFormat  = m_DepthStencilFormat;
	d3dpp.EnableAutoDepthStencil  = TRUE;
	d3dpp.Windowed = !m_isFullScreen;
	d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
	d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
	//All parameter is filled Check the device type first
	//Now I can create the device
	if(FAILED(m_pD3D9Object->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_hMainWnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&m_pD3DDevice) ) )
	{
		return false;
	}
	return true;
}

void CD3DApplication::destoryApp()
{
   if(m_pD3DDevice->Release() >0)
   {
	   //MessageBoxA(NULL,"有资源没有释放!","警告",MB_OK);
   }
   m_pD3DDevice = NULL;
   m_pD3D9Object->Release();
   m_pD3D9Object= NULL;
}

bool CD3DApplication::loop()
{
	MSG msg;
	//DWORD  thisTick;
	DWORD  lastTick;
	int count=0;
	lastTick=GetTickCount();
	while( 1 )
	{  
		if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
		{
			if( !GetMessage( &msg, NULL, 0, 0 ) )//Remove The message From the Message Queue
			{
				return msg.wParam != 0;
			}
			//if ( !TranslateAccelerator( g_AppData.hWnd, g_AppData.hAccel, &msg ) ) 
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
		else
		{
			DWORD thisTickt = GetTickCount();
			long passedTime = thisTickt - lastTick;
			lastTick = thisTickt;
			onRender(passedTime);
		}
	}
	return true;
}

LONG CALLBACK CD3DApplication::windowProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	if(hWnd == m_pApp->m_hMainWnd)
	{
		return m_pApp->onWndMessage(msg,wParam,lParam);
	}
	return (LONG)::DefWindowProc(hWnd,msg,wParam,lParam);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -