📄 soft shadows.cpp
字号:
/*-----------------------------------------------------------------------------
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 + -