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

📄 soft shadows.cpp

📁 这是一个用VC和DirectX编写的实时阴影程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*-----------------------------------------------------------------------------
	Name	: Soft Shadows.cpp
	Desc	: Main source file.
	Author	: Anirudh S Shastry. Copyright (c) 2004.
	Date	: 22nd June, 2004.
-----------------------------------------------------------------------------*/

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <stdio.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <mmsystem.h>
#include "resource.h"

#define SHADOW_MAP_SIZE	512
#define SCREEN_WIDTH	1024
#define SCREEN_HEIGHT	768

#define SAFE_RELEASE( x )	{ if( x ) { x->Release(); x = NULL; } }

//
// Gaussian functions
//
float GetGaussianDistribution( float x, float y, float rho ) {
    float g = 1.0f / sqrt( 2.0f * 3.141592654f * rho * rho );
    return g * exp( -(x * x + y * y) / (2 * rho * rho) );
}

void GetGaussianOffsets( bool bHorizontal, D3DXVECTOR2 vViewportTexelSize,
						 D3DXVECTOR2* vSampleOffsets, float* fSampleWeights ) {
    // Get the center texel offset and weight
    fSampleWeights[0] = 1.0f * GetGaussianDistribution( 0, 0, 2.0f );
    vSampleOffsets[0] = D3DXVECTOR2( 0.0f, 0.0f );
    
	// Get the offsets and weights for the remaining taps
	if( bHorizontal ) {
		for( int i = 1; i < 15; i += 2 ) {
			vSampleOffsets[i + 0] = D3DXVECTOR2(  i * vViewportTexelSize.x, 0.0f );
			vSampleOffsets[i + 1] = D3DXVECTOR2( -i * vViewportTexelSize.x, 0.0f );

			fSampleWeights[i + 0] = 2.0f * GetGaussianDistribution( float(i + 0), 0.0f, 3.0f );
			fSampleWeights[i + 1] = 2.0f * GetGaussianDistribution( float(i + 1), 0.0f, 3.0f );
		}
	}

	else {
		for( int i = 1; i < 15; i += 2 ) {
			vSampleOffsets[i + 0] = D3DXVECTOR2( 0.0f,  i * vViewportTexelSize.y );
			vSampleOffsets[i + 1] = D3DXVECTOR2( 0.0f, -i * vViewportTexelSize.y );
			
			fSampleWeights[i + 0] = 2.0f * GetGaussianDistribution( 0.0f, float(i + 0), 3.0f );
			fSampleWeights[i + 1] = 2.0f * GetGaussianDistribution( 0.0f, float(i + 1), 3.0f );
		}
	}
}

//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
HWND				g_hWnd				= NULL;
LPDIRECT3D9			g_pD3D				= NULL;
LPDIRECT3DDEVICE9	g_pd3dDevice		= NULL;

LPD3DXFONT			g_pFont				= NULL;

LPD3DXMESH			g_pScene			= NULL;
LPD3DXEFFECT		g_pEffect			= NULL;

LPDIRECT3DVERTEXBUFFER9	g_pQuadVB		= NULL;

LPDIRECT3DTEXTURE9	g_pColorMap_Floor	= NULL;
LPDIRECT3DTEXTURE9	g_pColorMap_Statue	= NULL;
LPDIRECT3DTEXTURE9	g_pSpotMap			= NULL;

LPDIRECT3DTEXTURE9	g_pShadowMap		= NULL;
LPDIRECT3DSURFACE9	g_pShadowSurf		= NULL;
LPDIRECT3DSURFACE9	g_pShadowDepth		= NULL;

LPDIRECT3DTEXTURE9	g_pScreenMap		= NULL;
LPDIRECT3DSURFACE9	g_pScreenSurf		= NULL;

LPDIRECT3DTEXTURE9	g_pBlurMap[2]		= {NULL};
LPDIRECT3DSURFACE9	g_pBlurSurf[2]		= {NULL};

LPDIRECT3DSURFACE9	g_pNewDepthRT		= NULL;
LPDIRECT3DSURFACE9	g_pOldColorRT		= NULL;
LPDIRECT3DSURFACE9	g_pOldDepthRT		= NULL;

D3DXVECTOR2			g_vSampleOffsets[15];
FLOAT				g_fSampleWeights[15];

LPDIRECT3DSURFACE9	g_pScreenshot		= NULL;
UINT				g_uNumScreenshots	= 0;

UINT				g_uFrameCount		= 0;
FLOAT				g_fStartTime		= 0.0f;
FLOAT				g_fFramerate		= 0.0f;
FLOAT				g_fStopTime			= 0.0f;
BOOL				g_bDisplayStats		= TRUE;

D3DXVECTOR3			g_vEyePos			= D3DXVECTOR3( -20.0f, 20.0f, -20.0f );
D3DXVECTOR3			g_vEyeAim			= D3DXVECTOR3(  20.0f,  0.0f,  20.0f );
D3DXVECTOR3			g_vUp				= D3DXVECTOR3(   0.0f,  1.0f,   0.0f );

BOOL				g_bWindowed			= FALSE;
BOOL				g_bWireframe		= FALSE;
BOOL				g_bSoftShadows		= TRUE;
BOOL				g_bFiltered			= TRUE;

// Vertex element
D3DVERTEXELEMENT9 dwElement[] =
{
	{ 0,   0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
	
	{ 0,  12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL,   0 },
	
	{ 0,  24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
	
	D3DDECL_END()
};

struct QuadVertex
{
	D3DXVECTOR4 p;
	D3DXVECTOR2 t;
};

#define FVF_QUADVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)

//-----------------------------------------------------------------------------
// Functions
//-----------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow);
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT Initialize();
HRESULT ShutDown();
HRESULT Render();
HRESULT FrameMove();
HRESULT ScreenGrab();

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR     lpCmdLine,
                    int       nCmdShow )
{
	WNDCLASSEX winClass;
	MSG        uMsg;

    memset(&uMsg,0,sizeof(uMsg));

	winClass.lpszClassName = "MY_WINDOWS_CLASS";
	winClass.cbSize        = sizeof(WNDCLASSEX);
	winClass.style         = CS_HREDRAW | CS_VREDRAW;
	winClass.lpfnWndProc   = WindowProc;
	winClass.hInstance     = hInstance;
	winClass.hIcon	       = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);
    winClass.hIconSm	   = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);
	winClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
	winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	winClass.lpszMenuName  = (LPCSTR)IDR_MENU1;
	winClass.cbClsExtra    = 0;
	winClass.cbWndExtra    = 0;

	if( RegisterClassEx( &winClass) == 0 )
		return E_FAIL;

	if( g_bWindowed )
		g_hWnd = CreateWindowEx( NULL, "MY_WINDOWS_CLASS", "Soft Shadows", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
								 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInstance, NULL );
	else
		g_hWnd = CreateWindowEx( NULL, "MY_WINDOWS_CLASS", "Soft Shadows", WS_POPUP | WS_SYSMENU | WS_VISIBLE,
								 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInstance, NULL );

	if( g_hWnd == NULL )
		return E_FAIL;

    ShowWindow( g_hWnd, nCmdShow );
    UpdateWindow( g_hWnd );

	if( FAILED( Initialize() ) )
	{
		MessageBox( g_hWnd, "Unable to initialize Direct3D!", ERROR, MB_OK | MB_ICONERROR );
		return E_FAIL;
	}

	// Get the starting time
	g_fStartTime = timeGetTime() * 0.001f;

	while( uMsg.message != WM_QUIT )
	{
		if( PeekMessage( &uMsg, NULL, 0, 0, PM_REMOVE ) )
		{ 
			TranslateMessage( &uMsg );
			DispatchMessage( &uMsg );
		}
        else
		{
		    FrameMove();
			Render();
			g_uFrameCount++;
			g_fFramerate = (FLOAT)g_uFrameCount / (timeGetTime() * 0.001f - g_fStartTime);
		}
	}
	
	// Get the stopping time
	g_fStopTime = timeGetTime() * 0.001f;

	if( FAILED( ShutDown() ) )
	{
		MessageBox( g_hWnd, "Unable to shutdown Direct3D!", ERROR, MB_OK | MB_ICONERROR );
		return E_FAIL;
	}		

    UnregisterClass( "MY_WINDOWS_CLASS", winClass.hInstance );

	return uMsg.wParam;
}

//-----------------------------------------------------------------------------
// Name: WindowProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT CALLBACK WindowProc( HWND   hWnd, 
							 UINT   msg, 
							 WPARAM wParam, 
							 LPARAM lParam )
{
    switch( msg )
	{
        case WM_KEYDOWN:
		{
			switch( wParam )
			{
				case VK_ESCAPE:
					PostQuitMessage(0);
					break;

				case VK_UP:
				{
					D3DXVECTOR3 vView;
					D3DXVec3Normalize( &vView, &(g_vEyeAim - g_vEyePos) );
					g_vEyePos.x += vView.x;
					g_vEyePos.z += vView.z;
					g_vEyeAim.x += vView.x;
					g_vEyeAim.z += vView.z;
					break;
				}
				
				case VK_DOWN:
				{	
					D3DXVECTOR3 vView;
					D3DXVec3Normalize( &vView, &(g_vEyeAim - g_vEyePos) );
					g_vEyePos.x -= vView.x;
					g_vEyePos.z -= vView.z;
					g_vEyeAim.x -= vView.x;
					g_vEyeAim.z -= vView.z;
					break;
				}

				case VK_LEFT:
				{	
					D3DXVECTOR3 vView, vStrafe;
					D3DXVec3Normalize( &vView, &(g_vEyeAim - g_vEyePos) );
					D3DXVec3Cross( &vStrafe, &vView, &g_vUp );
					g_vEyePos.x += vStrafe.x;
					g_vEyePos.z += vStrafe.z;
					g_vEyeAim.x += vStrafe.x;
					g_vEyeAim.z += vStrafe.z;
					break;
				}
				
				case VK_RIGHT:
				{	
					D3DXVECTOR3 vView, vStrafe;
					D3DXVec3Normalize( &vView, &(g_vEyeAim - g_vEyePos) );
					D3DXVec3Cross( &vStrafe, &vView, &g_vUp );
					g_vEyePos.x -= vStrafe.x;
					g_vEyePos.z -= vStrafe.z;
					g_vEyeAim.x -= vStrafe.x;
					g_vEyeAim.z -= vStrafe.z;
					break;
				}

				case 'Z':
				{
					g_vEyePos.y += 1.0f;
					break;
				}
				
				case 'X':
				{
					g_vEyePos.y -= 1.0f;
					break;
				}

				case 'W':
				{
					g_bWireframe = !g_bWireframe;
					break;
				}

				case 'S':
				{
					g_bSoftShadows = !g_bSoftShadows;
					break;
				}
				
				case 'F':
				{
					g_bFiltered = !g_bFiltered;
					break;
				}

				case 'G':
				{
					ScreenGrab();
					break;
				}

				case VK_F1:
				{
					g_bDisplayStats = !g_bDisplayStats;
				}

			}
		}
        break;

		case WM_CLOSE:
		{
			MessageBox( g_hWnd, "By Anirudh S Shastry. Copyright (c) 2004.", "About", MB_OK );
			PostQuitMessage(0);
		}
		
        case WM_DESTROY:
		{
            PostQuitMessage(0);
		}
        break;
        
		case WM_COMMAND:
		{
			switch( LOWORD(wParam) )
            {
				case ID_FILE_EXIT:
				{
                    SendMessage( g_hWnd, WM_CLOSE, 0, 0 );
                    return 0;
				}
 				
				case ID_HELP_ABOUT:
				{
					MessageBox( g_hWnd, "By Anirudh S Shastry. Copyright (c) 2004.", "About", MB_OK );
                    return 0;
				}

				case ID_FILE_TOGGLESTATS:
				{
					g_bDisplayStats = !g_bDisplayStats;
					return 0;
				}
 				
				default:

⌨️ 快捷键说明

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