Integrating exported RenderMonkey .fx file into DirectX.

Started by
-1 comments, last by bushman_IL 14 years, 10 months ago
Hello, I have been having the toughest time getting an .fx file exported from the RenderMonkey shadow example into my simple spinning cube program. I know the basics about shaders but not quite near efficient yet. If anyone would be able to help me integrate this shader into my program, this would be a tremendous help, and hopefully help out whoever else stumbles upon my post. Here is the simple spinning cube example I am using

#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "d3d9.lib")

#include <windows.h>
#include <dx9/d3dx9.h>
#include <dx9/d3d9.h>

HDC        hDC = NULL;
HWND       hWnd = NULL;
HINSTANCE  hInstance;			
LPDIRECT3D9   pD3D = NULL;
LPDIRECT3DDEVICE9  pD3DDevice = NULL;

bool	keys[256];	
bool	active=TRUE;
bool	fullscreen=TRUE;

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

IDirect3DVertexBuffer9 *pVertexBuffer = NULL;  // Our Vertex Buffer

struct tVertex				// Our new vertex struct
{
    float x, y, z;			// 3D position
    DWORD color;			// Hex Color Value
};


tVertex cube[24] =			// Vertex Array
{	
	// Front Blue Color
	{-1.0f, 1.0f,-1.0f,  0xF00FF00F },
	{ 1.0f, 1.0f,-1.0f,  0xF00FF00F },
	{-1.0f,-1.0f,-1.0f,  0xF00FF00F },
	{ 1.0f,-1.0f,-1.0f,  0xF00FF00F },
	// Back Orange Color
	{-1.0f, 1.0f, 1.0f,  0xFFF8800F },
	{-1.0f,-1.0f, 1.0f,  0xFFF8800F },
	{ 1.0f, 1.0f, 1.0f,  0xFFF8800F },
	{ 1.0f,-1.0f, 1.0f,  0xFFF8800F },
	// Top Red Color
	{-1.0f, 1.0f, 1.0f,  0xFFF0000F },
	{ 1.0f, 1.0f, 1.0f,  0xFFF0000F },
	{-1.0f, 1.0f,-1.0f,  0xFFF0000F },
	{ 1.0f, 1.0f,-1.0f,  0xFFF0000F },
	// Bottom Yellow Color
	{-1.0f,-1.0f, 1.0f,  0xFFFFF00F },
	{-1.0f,-1.0f,-1.0f,  0xFFFFF00F },
	{ 1.0f,-1.0f, 1.0f,  0xFFFFF00F },
	{ 1.0f,-1.0f,-1.0f,  0xFFFFF00F },
	// Right Blue Color
	{ 1.0f, 1.0f,-1.0f,  0xF0000FFF },
	{ 1.0f, 1.0f, 1.0f,  0xF0000FFF },
	{ 1.0f,-1.0f,-1.0f,  0xF0000FFF },
	{ 1.0f,-1.0f, 1.0f,  0xF0000FFF },
	// Left Violet Color
	{-1.0f, 1.0f,-1.0f,  0xFFF00FFF },
	{-1.0f,-1.0f,-1.0f,  0xFFF00FFF },
	{-1.0f, 1.0f, 1.0f,  0xFFF00FFF },
	{-1.0f,-1.0f, 1.0f,  0xFFF00FFF }
};

LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

void ReSizeD3DScene(int width, int height)		// Resize And Initialize The DX Window
{
	if (height==0)										// Prevent A Divide By Zero By
	{
		height=1;										// Making Height Equal One
	}

	D3DXMATRIX projection_matrix;

	D3DXMatrixPerspectiveFovLH(&projection_matrix, 45.0f, (float)width/(float)height, 0.1f, 100.0f );

	pD3DDevice->SetTransform( D3DTS_PROJECTION, &(D3DMATRIX)projection_matrix );
	D3DXMatrixIdentity(&projection_matrix);

}

int InitD3D()
{
	pD3DDevice->SetRenderState(D3DRS_ZENABLE,  TRUE ); // Z-Buffer (Depth Buffer)
    pD3DDevice->SetRenderState(D3DRS_CULLMODE, FALSE); // Disable Backface Culling
    pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); // Disable Light


	pD3DDevice->CreateVertexBuffer( 24*sizeof(tVertex),0, D3DFVF_CUSTOMVERTEX,
                                       D3DPOOL_DEFAULT, &pVertexBuffer, NULL );
	unsigned char *pVertices = NULL;

    pVertexBuffer->Lock( 0, sizeof(cube), (void**)&pVertices, 0 );
    memcpy( pVertices, cube, sizeof(cube) );
    pVertexBuffer->Unlock();

	return TRUE;
}

int DrawD3DScene()
{
	
    pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
								D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,0.0f), 1.0f, 0 );

	static float rotqube = 0.0f;
	rotqube  += 0.9f;


    D3DXMATRIX matWorld;			// Create The World Matrix
    D3DXMATRIX matTranslation;		// Create a Translation Matrix
	D3DXMATRIX matRotX;				// Create X Axis Rotation Matrix
	D3DXMATRIX matRotY;				// Create Y Axis Rotation Matrix
	D3DXMATRIX matRotZ;				// Create Z Axis Rotation Matrix
	D3DXMATRIX matRotXYZ;			// Create XYZ Rotation Matrix


    D3DXMatrixTranslation( &matTranslation, 0.0f, 0.0f, 5.0f ); // Translate The Cube 5 Units Into The Screen

	D3DXMatrixRotationY(&matRotY, D3DXToRadian(rotqube));		// Rotate In Y Direction
	D3DXMatrixRotationX(&matRotX, D3DXToRadian(rotqube));		// Rotate In X Direction
	D3DXMatrixRotationY(&matRotY, D3DXToRadian(rotqube));		// Rotate In Z Direction
	D3DXMatrixRotationZ(&matRotZ, D3DXToRadian(rotqube));

	D3DXMatrixRotationYawPitchRoll( &matRotXYZ, D3DXToRadian(rotqube), D3DXToRadian(rotqube), D3DXToRadian(rotqube) );

    matWorld = (matRotY * matRotX  * matRotZ) * matTranslation;



    pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld );	// Set The Transformation

    pD3DDevice->BeginScene();							// Begin Direct3D Scene

    pD3DDevice->SetStreamSource( 0, pVertexBuffer, 0, sizeof(tVertex) );
    pD3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

	pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,  0, 2 ); // Draw Front
	pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,  4, 2 ); // Draw Back
	pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,  8, 2 ); // Draw Top
	pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 12, 2 ); // Draw Bottom
	pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 16, 2 ); // Draw Right
	pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 20, 2 ); // Draw Left

	pD3DDevice->EndScene();								// End Direct3D Scene
	
	pD3DDevice->Present( NULL, NULL, NULL, NULL );// Display The Result
	
	return TRUE;
}

void KillD3DScene() 
{
    if( pVertexBuffer != NULL )	
	{ 
		pVertexBuffer->Release();						// Release The Vertex Buffer
		pVertexBuffer = NULL;
	}
}

void KillD3DWindow()									// Properly Kill The Window
{

	KillD3DScene();										// Release D3D Scene

    if (pD3DDevice != NULL)	pD3DDevice->Release();		// Release D3D Device
	
	if (pD3D != NULL) pD3D->Release();					// Release D3D Interface

	if (fullscreen)										// Are We In Fullscreen Mode?
	{
		ChangeDisplaySettings(NULL,0);					// If So Switch Back To The Desktop
		ShowCursor(TRUE);								// Show Mouse Pointer
	}

	if (hDC && !ReleaseDC(hWnd,hDC))					// Are We Able To Release The DC
	{
		MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hDC=NULL;										// Set DC To NULL
	}

	if (hWnd && !DestroyWindow(hWnd))					// Are We Able To Destroy The Window?
	{
		MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hWnd=NULL;										// Set hWnd To NULL
	}

	if (!UnregisterClass("Direct3D",hInstance))			// Are We Able To Unregister Class
	{
		MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hInstance=NULL;									// Set hInstance To NULL
	}
}


BOOL CreateD3DWindow(char* title, int width, int height, bool fullscreenflag)
{
	WNDCLASS	wc;
	DWORD		dwExStyle;				// Window Extended Style
	DWORD		dwStyle;				// Window Style
	RECT		WindowRect;				// Grabs Rectangle Upper Left / Lower Right Values
	WindowRect.left=(long)0;			// Set Left Value To 0
	WindowRect.right=(long)width;		// Set Right Value To Requested Width
	WindowRect.top=(long)0;				// Set Top Value To 0
	WindowRect.bottom=(long)height;		// Set Bottom Value To Requested Height

	fullscreen=fullscreenflag;			// Set The Global Fullscreen Flag

	hInstance			= GetModuleHandle(NULL);				// Grab An Instance For Our Window
	wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;	// Redraw On Size, And Own DC For Window.
	wc.lpfnWndProc		= (WNDPROC) WndProc;					// WndProc Handles Messages
	wc.cbClsExtra		= 0;									// No Extra Window Data
	wc.cbWndExtra		= 0;									// No Extra Window Data
	wc.hInstance		= hInstance;							// Set The Instance
	wc.hIcon			= LoadIcon(NULL, IDI_WINLOGO);			// Load The Default Icon
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);			// Load The Arrow Pointer
	wc.hbrBackground	= NULL;									// No Background Required For D3D
	wc.lpszMenuName		= NULL;									// We Don't Want A Menu
	wc.lpszClassName	= "Direct3D";							// Set The Class Name


	if (!RegisterClass(&wc))									// Attempt To Register The Window Class
	{
		MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;											// Return FALSE
	}

	if (fullscreen)												// Fullscreen Mode?
	{
		dwExStyle=WS_EX_APPWINDOW;								// Window Extended Style
		dwStyle=WS_POPUP;										// Windows Style
		ShowCursor(FALSE);										// Hide Mouse Pointer
	}
	else
	{
		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// Window Extended Style
		dwStyle=WS_OVERLAPPEDWINDOW;							// Windows Style
	}


	AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);	// Adjust Window To True Requested Size


	// Create The Window
	if (!(hWnd=CreateWindowEx(	dwExStyle,							// Extended Style For The Window
								"Direct3D",							// Class Name
								title,								// Window Title
								dwStyle |							// Defined Window Style
								WS_CLIPSIBLINGS |					// Required Window Style
								WS_CLIPCHILDREN,					// Required Window Style
								0, 0,								// Window Position
								WindowRect.right-WindowRect.left,	// Calculate Window Width
								WindowRect.bottom-WindowRect.top,	// Calculate Window Height
								NULL,								// No Parent Window
								NULL,								// No Menu
								hInstance,							// Instance
								NULL)))								// Dont Pass Anything To WM_CREATE
	{
		KillD3DWindow();							// Reset The Display
		MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}


	if (!(hDC=GetDC(hWnd)))							// Did We Get A Device Context?
	{
		KillD3DWindow();								// Reset The Display
		MessageBox(NULL,"Can't Create A Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}


	pD3D = Direct3DCreate9( D3D_SDK_VERSION );		// Check for correct DirectX 3D version
	if ( pD3D == NULL )
	{
		KillD3DWindow();							// Reset The Display
		MessageBox(NULL,"Can't find D3D SDK Version 9.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}


	D3DPRESENT_PARAMETERS d3dpp=					// d3dpp Tells Windows How We Want Things To Be
	{
		width,										// Back Buffer Width
		height,										// Back Buffer Height
		D3DFMT_R5G6B5,								// Back Buffer Format (Color Depth)
		1,											// Back Buffer Count (Double Buffer)
		D3DMULTISAMPLE_NONE,						// Multi Sample Type
		0,											// Multi Sample Quality
		D3DSWAPEFFECT_DISCARD,						// Swap Effect (Fast)
		hWnd,										// The Window Handle
		!fullscreen,								// Windowed or Fullscreen
		TRUE,										// Enable Auto Depth Stencil  
		D3DFMT_D16,									// 16Bit Z-Buffer (Depth Buffer)
		0,											// No Flags
		D3DPRESENT_RATE_DEFAULT,					// Default Refresh Rate
		D3DPRESENT_INTERVAL_DEFAULT					// Default Presentation Interval (vertical sync)
	};


	// Check The Wanted Surface Format.
	if ( FAILED( pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
									      d3dpp.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL,
									      D3DRTYPE_SURFACE, d3dpp.AutoDepthStencilFormat ) ) )
	{
		KillD3DWindow();							// Reset The Display
		MessageBox(NULL,"Can't Find Surface Format.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}


	// Create The DirectX 3D Device 
	if(FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
					 D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pD3DDevice ) ) )
	{
		KillD3DWindow();								// Reset The Display
		MessageBox(NULL,"Can't Create DirectX 3D Device.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
	}


	ShowWindow(hWnd,SW_SHOW);						// Show The Window
	SetForegroundWindow(hWnd);						// Slightly Higher Priority
	SetFocus(hWnd);									// Sets Keyboard Focus To The Window
	ReSizeD3DScene(width, height);					// Set Up Our Perspective D3D Screen


	if (!InitD3D())									// Initialize Our Newly Created D3D Window
	{
		KillD3DWindow();								// Reset The Display
		MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return FALSE
	}

	return TRUE;
}

LRESULT CALLBACK WndProc(	HWND	hWnd, 
							UINT	uMsg, 
							WPARAM	wParam, 
							LPARAM	lParam )
{
    switch( uMsg )
	{
		case WM_ACTIVATE:							// Watch For Window Activate Message
		{
			if (!HIWORD(wParam))					// Check Minimization State
			{
				active=TRUE;						// Program Is Active
			}
			else
			{
				active=FALSE;						// Program Is No Longer Active
			}

			return 0;								// Return To The Message Loop
		}

		case WM_SYSCOMMAND:							// Intercept System Commands
		{
			switch (wParam)							// Check System Calls
			{
				case SC_SCREENSAVE:					// Screensaver Trying To Start?
				case SC_MONITORPOWER:				// Monitor Trying To Enter Powersave?
				return 0;							// Prevent From Happening
			}
			break;									// Exit
		}

		case WM_CLOSE:								// Did We Receive A Close Message?
		{
			PostQuitMessage(0);						// Send A Quit Message
			return 0;								// Jump Back
		}

		case WM_KEYDOWN:							// Is A Key Being Held Down?
		{
			keys[wParam] = TRUE;					// If So, Mark It As TRUE
			return 0;								// Jump Back
		}

		case WM_KEYUP:								// Has A Key Been Released?
		{
			keys[wParam] = FALSE;					// If So, Mark It As FALSE
			return 0;								// Jump Back
		}

		case WM_SIZE:								// Resize The Direct3D Window
		{
			if(!fullscreen)
				ReSizeD3DScene(LOWORD(lParam), HIWORD(lParam));  // LoWord=Width, HiWord=Height
			return 0;								// Jump Back
		}
	}

	// Pass All Unhandled Messages To DefWindowProc
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

int WINAPI WinMain( HINSTANCE	hInstance,
                    HINSTANCE	hPrevInstance,
                    LPSTR		lpCmdLine,
                    int			nCmdShow )
{

	MSG     msg;
	BOOL	done=FALSE;								// Bool Variable To Exit Loop

	// Ask The User Which Screen Mode They Prefer
	if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
	{
		fullscreen=FALSE;							// Windowed Mode
	}

	// Create Our DirectX 3D Window
	if (!CreateD3DWindow("APRON TUTORIALS",640,480,fullscreen))
	{
		return 0;									// Quit If Window Was Not Created
	}
  

	while(!done)									// Loop That Runs While done=FALSE
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))	// Is There A Message Waiting?
		{
			if (msg.message==WM_QUIT)				// Have We Received A Quit Message?
			{
				done=TRUE;							// If So done=TRUE
			}
			else									// If Not, Deal With Window Messages
			{
				TranslateMessage(&msg);				// Translate The Message
				DispatchMessage(&msg);				// Dispatch The Message
			}
		}
		else										// If There Are No Messages
		{
			// Draw The Scene.  Watch For ESC Key And Quit Messages From DrawD3DScene()
			if ((active && !DrawD3DScene()) || keys[VK_ESCAPE])	// Active?  Was There A Quit Received?
			{
				done=TRUE;							// ESC or DrawD3DScene Signalled A Quit
			}

			if (keys[VK_F1])						// Is F1 Being Pressed?
			{
				keys[VK_F1]=FALSE;					// If So Make Key FALSE
				KillD3DWindow();					// Kill Our Current Window
				fullscreen=!fullscreen;				// Toggle Fullscreen / Windowed Mode
				// Recreate Our DirectX 3D Window
				if (!CreateD3DWindow("APRON TUTORIALS",640,480,fullscreen))
				{
					return 0;						// Quit If Window Was Not Created
				}
			}
		}
	}

	// Shutdown
	KillD3DWindow();
	return (msg.wParam);							// Exit The Program
}

Here is the shader I am using which was exported from the RenderMonkey Shadow example

//**************************************************************//
//  Effect File exported by RenderMonkey 1.6
//
//  - Although many improvements were made to RenderMonkey FX  
//    file export, there are still situations that may cause   
//    compilation problems once the file is exported, such as  
//    occasional naming conflicts for methods, since FX format 
//    does not support any notions of name spaces. You need to 
//    try to create workspaces in such a way as to minimize    
//    potential naming conflicts on export.                    
//    
//  - Note that to minimize resulting name collisions in the FX 
//    file, RenderMonkey will mangle names for passes, shaders  
//    and function names as necessary to reduce name conflicts. 
//**************************************************************//

//--------------------------------------------------------------//
// Shadow Effects
//--------------------------------------------------------------//
//--------------------------------------------------------------//
// SoftShadows
//--------------------------------------------------------------//
//--------------------------------------------------------------//
// Object
//--------------------------------------------------------------//
string Shadow_Effects_SoftShadows_Object_Sphere : ModelData = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Models\\Sphere.3ds";

float4x4 view_proj_matrix : ViewProjection;
float4 lightPos
<
   string UIName = "lightPos";
   string UIWidget = "Direction";
   bool UIVisible =  true;
   float4 UIMin = float4( -400.00, -400.00, -400.00, -400.00 );
   float4 UIMax = float4( 400.00, 400.00, 400.00, 400.00 );
   bool Normalize =  false;
> = float4( -62.00, 104.00, 60.00, 0.00 );
float4 view_position : ViewPosition;
struct VS_OUTPUT {
   float4 Pos:      POSITION;
   float3 normal:   TEXCOORD0;
   float3 lightVec: TEXCOORD1;
   float3 viewVec:  TEXCOORD2;
};

VS_OUTPUT Shadow_Effects_SoftShadows_Object_Vertex_Shader_main(float4 Pos: POSITION, float3 normal: NORMAL){
   VS_OUTPUT Out;

   Out.Pos = mul(view_proj_matrix, Pos);
   // World-space lighting
   Out.normal = normal;
   Out.lightVec = lightPos - Pos.xyz;
   Out.viewVec = view_position - Pos.xyz;

   return Out;
}





float4 modelColor
<
   string UIName = "modelColor";
   string UIWidget = "Color";
   bool UIVisible =  true;
> = float4( 0.36, 0.45, 1.00, 1.00 );
float4 Shadow_Effects_SoftShadows_Object_Pixel_Shader_main(float3 normal: TEXCOORD0, float3 lightVec: TEXCOORD1, float3 viewVec: TEXCOORD2) : COLOR {
   normal = normalize(normal);
   lightVec = normalize(lightVec);
   viewVec = normalize(viewVec);

   // Simple standard lighting
   float diffuse = 0.5 + 0.5 * dot(lightVec, normal);
   float specular = pow(saturate(dot(reflect(-viewVec, normal), lightVec)), 16);

   return diffuse * modelColor + 0.5 * specular;
}




//--------------------------------------------------------------//
// Light
//--------------------------------------------------------------//
string Shadow_Effects_SoftShadows_Light_Sphere : ModelData = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Models\\Sphere.3ds";

float4x4 Shadow_Effects_SoftShadows_Light_Vertex_Shader_view_proj_matrix : ViewProjection;
float4 Shadow_Effects_SoftShadows_Light_Vertex_Shader_lightPos
<
   string UIName = "Shadow_Effects_SoftShadows_Light_Vertex_Shader_lightPos";
   string UIWidget = "Direction";
   bool UIVisible =  true;
   float4 UIMin = float4( -400.00, -400.00, -400.00, -400.00 );
   float4 UIMax = float4( 400.00, 400.00, 400.00, 400.00 );
   bool Normalize =  false;
> = float4( -62.00, 104.00, 60.00, 0.00 );
struct Shadow_Effects_SoftShadows_Light_Vertex_Shader_VS_OUTPUT {
   float4 Pos: POSITION;
};

Shadow_Effects_SoftShadows_Light_Vertex_Shader_VS_OUTPUT Shadow_Effects_SoftShadows_Light_Vertex_Shader_main(float4 Pos: POSITION){
   Shadow_Effects_SoftShadows_Light_Vertex_Shader_VS_OUTPUT Out;

   // Compensate for model not being a
   // perfect sphere around origin
   Pos.xyz = 10 * normalize(Pos.xyz);
   // Get the light in place
   Pos.xyz += Shadow_Effects_SoftShadows_Light_Vertex_Shader_lightPos;

   Out.Pos = mul(Shadow_Effects_SoftShadows_Light_Vertex_Shader_view_proj_matrix, Pos);

   return Out;
}






float4 Shadow_Effects_SoftShadows_Light_Pixel_Shader_main() : COLOR {
   return 1;
}


//--------------------------------------------------------------//
// Depth
//--------------------------------------------------------------//
string Shadow_Effects_SoftShadows_Depth_Sphere : ModelData = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Models\\Sphere.3ds";

texture Depth_Tex : RenderColorTarget
<
   float2 RenderTargetDimensions = {512,512};
   string Format="D3DFMT_A8R8G8B8";
   float  ClearDepth=1.000000;
   int    ClearColor=0;
>;
float4x4 Shadow_Effects_SoftShadows_Depth_Vertex_Shader_view_proj_matrix;
float planeZ
<
   string UIName = "planeZ";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = -100.00;
   float UIMax = 0.00;
> = float( -59.00 );
float4 Shadow_Effects_SoftShadows_Depth_Vertex_Shader_lightPos
<
   string UIName = "Shadow_Effects_SoftShadows_Depth_Vertex_Shader_lightPos";
   string UIWidget = "Direction";
   bool UIVisible =  true;
   float4 UIMin = float4( -400.00, -400.00, -400.00, -400.00 );
   float4 UIMax = float4( 400.00, 400.00, 400.00, 400.00 );
   bool Normalize =  false;
> = float4( -62.00, 104.00, 60.00, 0.00 );
float planeSize
<
   string UIName = "planeSize";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 1000.00;
> = float( 500.00 );
struct Shadow_Effects_SoftShadows_Depth_Vertex_Shader_VS_OUTPUT {
   float4 Pos:  POSITION;
   float3 lVec: TEXCOORD0;
   float3 sVec: TEXCOORD1;
};

Shadow_Effects_SoftShadows_Depth_Vertex_Shader_VS_OUTPUT Shadow_Effects_SoftShadows_Depth_Vertex_Shader_main(float4 Pos: POSITION, float3 normal: NORMAL){
   Shadow_Effects_SoftShadows_Depth_Vertex_Shader_VS_OUTPUT Out;

   // The z + planeZ = 0 plane
   float4 plane = float4(0, 0, 1, -planeZ);

   // We create a matrix that projects the model down into
   // the plane. This is a task that's better done on the
   // CPU and just passed to the vertex shader since it's
   // constant for the whole model. However,in RenderMonkey
   // we don't have that choice and will have to create it
   // in the vertex shader instead.
   float4x4 shadowMatrix;

   shadowMatrix[0] = -Shadow_Effects_SoftShadows_Depth_Vertex_Shader_lightPos.x * plane;
   shadowMatrix[1] = -Shadow_Effects_SoftShadows_Depth_Vertex_Shader_lightPos.y * plane;
   shadowMatrix[2] = -Shadow_Effects_SoftShadows_Depth_Vertex_Shader_lightPos.z * plane;
   shadowMatrix[3] = -plane;

   float dist = dot(Shadow_Effects_SoftShadows_Depth_Vertex_Shader_lightPos, plane.xyz) - planeZ;

   shadowMatrix[0].x += dist;
   shadowMatrix[1].y += dist;
   shadowMatrix[2].z += dist;
   shadowMatrix[3].w += dist;

   // Project the vertex down in the plane
   float4 sPos = mul(shadowMatrix, Pos);
   // Map the plane onto the rendertarget. The rendertarget
   // will cover exactly the quad we put shadows on.
   Out.Pos = float4(planeZ * sPos.xy / (planeSize * sPos.z), 0, 1);
   // How blurry the shadows are supposed to be is determined
   // by how far the vertex and the shadow is from the light.
   Out.lVec = Shadow_Effects_SoftShadows_Depth_Vertex_Shader_lightPos - Pos.xyz;
   // sPos.w will in general not be 1, so we'll have
   // to do the perspective division
   Out.sVec = Shadow_Effects_SoftShadows_Depth_Vertex_Shader_lightPos - sPos.xyz / sPos.w;

   return Out;
}


float4 Shadow_Effects_SoftShadows_Depth_Pixel_Shader_main(float3 lVec: TEXCOORD0, float3 sVec: TEXCOORD1) : COLOR {
   float lLen = length(lVec);
   float sLen = length(sVec);

   // Blurriness factor
   return 1 - lLen / sLen;
}






//--------------------------------------------------------------//
// Dilate
//--------------------------------------------------------------//
string Shadow_Effects_SoftShadows_Dilate_Sphere : ModelData = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Models\\Sphere.3ds";

texture Dilate_Tex : RenderColorTarget
<
   float2 RenderTargetDimensions = {512,512};
   string Format="D3DFMT_A8R8G8B8";
   float  ClearDepth=1.000000;
   int    ClearColor=0;
>;
float4x4 Shadow_Effects_SoftShadows_Dilate_Vertex_Shader_view_proj_matrix;
struct Shadow_Effects_SoftShadows_Dilate_Vertex_Shader_VS_OUTPUT {
   float4 Pos: POSITION;
   float2 texCoord: TEXCOORD;
};

Shadow_Effects_SoftShadows_Dilate_Vertex_Shader_VS_OUTPUT Shadow_Effects_SoftShadows_Dilate_Vertex_Shader_main(float4 Pos: POSITION){
   Shadow_Effects_SoftShadows_Dilate_Vertex_Shader_VS_OUTPUT Out;
   
   // Clean up inaccuracies
   Pos.xy = sign(Pos.xy);

   Out.Pos = float4(Pos.xy, 0, 1);
   // Image-space
   Out.texCoord.x = 0.5 * (1 + Pos.x);
   Out.texCoord.y = 0.5 * (1 - Pos.y);

   return Out;
}



float dilateSize
<
   string UIName = "dilateSize";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 0.10;
> = float( 0.02 );
sampler Depth = sampler_state
{
   Texture = (Depth_Tex);
   ADDRESSU = CLAMP;
   ADDRESSV = CLAMP;
   MAGFILTER = LINEAR;
   MINFILTER = LINEAR;
   MIPFILTER = LINEAR;
};
// Simple dilate filter. We need to dilate the blurriness
// render target since the blur needs to spread outside the
// source image. If we didn't dilate, the shadow would get
// end with a sharp edge after a partial blur.

const float2 samples[12] = {
   -0.326212, -0.405805,
   -0.840144, -0.073580,
   -0.695914,  0.457137,
   -0.203345,  0.620716,
    0.962340, -0.194983,
    0.473434, -0.480026,
    0.519456,  0.767022,
    0.185461, -0.893124,
    0.507431,  0.064425,
    0.896420,  0.412458,
   -0.321940, -0.932615,
   -0.791559, -0.597705,
};

float4 Shadow_Effects_SoftShadows_Dilate_Pixel_Shader_main(float2 texCoord: TEXCOORD) : COLOR {
   float4 dilate = tex2D(Depth, texCoord);

   for (int i = 0; i < 12; i++){
      dilate = max(dilate, tex2D(Depth, texCoord + dilateSize * samples));
   }
   return dilate;
}




//--------------------------------------------------------------//
// Shadow
//--------------------------------------------------------------//
string Shadow_Effects_SoftShadows_Shadow_Sphere : ModelData = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Models\\Sphere.3ds";

texture Shadow_Tex : RenderColorTarget
<
   float2 RenderTargetDimensions = {1024,1024};
   string Format="D3DFMT_A8R8G8B8";
   float  ClearDepth=1.000000;
   int    ClearColor=0;
>;
float4x4 Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_view_proj_matrix;
float Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeZ
<
   string UIName = "Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeZ";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = -100.00;
   float UIMax = 0.00;
> = float( -59.00 );
float4 Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_lightPos
<
   string UIName = "Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_lightPos";
   string UIWidget = "Direction";
   bool UIVisible =  true;
   float4 UIMin = float4( -400.00, -400.00, -400.00, -400.00 );
   float4 UIMax = float4( 400.00, 400.00, 400.00, 400.00 );
   bool Normalize =  false;
> = float4( -62.00, 104.00, 60.00, 0.00 );
float Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeSize
<
   string UIName = "Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeSize";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 1000.00;
> = float( 500.00 );
struct Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_VS_OUTPUT {
   float4 Pos: POSITION;
};

Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_VS_OUTPUT Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_main(float4 Pos: POSITION){
   Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_VS_OUTPUT Out;

   // The z + Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeZ = 0 plane
   float4 plane = float4(0, 0, 1, -Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeZ);

   // We create a matrix that projects the model down into
   // the plane. This is a task that's better done on the
   // CPU and just passed to the vertex shader since it's
   // constant for the whole model. However,in RenderMonkey
   // we don't have that choice and will have to create it
   // in the vertex shader instead.
   float4x4 shadowMatrix;

   shadowMatrix[0] = -Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_lightPos.x * plane;
   shadowMatrix[1] = -Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_lightPos.y * plane;
   shadowMatrix[2] = -Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_lightPos.z * plane;
   shadowMatrix[3] = -plane;

   float dist = dot(Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_lightPos, plane.xyz) - Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeZ;

   shadowMatrix[0].x += dist;
   shadowMatrix[1].y += dist;
   shadowMatrix[2].z += dist;
   shadowMatrix[3].w += dist;

   // Project the vertex down in the plane
   float4 sPos = mul(shadowMatrix, Pos);
   // Map the plane onto the rendertarget. The rendertarget
   // will cover exactly the quad we put shadows on.
   Out.Pos = float4(Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeZ * sPos.xy / (Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_planeSize * sPos.z), 0, 1);

   return Out;
}




float4 Shadow_Effects_SoftShadows_Shadow_Pixel_Shader_main() : COLOR {
   return 1;
}


//--------------------------------------------------------------//
// Blur0
//--------------------------------------------------------------//
string Shadow_Effects_SoftShadows_Blur0_ScreenAlignedQuad : ModelData = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Models\\ScreenAlignedQuad.3ds";

texture Blur0_Tex : RenderColorTarget
<
   float2 RenderTargetDimensions = {512,512};
   string Format="D3DFMT_A8R8G8B8";
   float  ClearDepth=1.000000;
   int    ClearColor=0;
>;
float4x4 Shadow_Effects_SoftShadows_Blur0_Vertex_Shader_view_proj_matrix;
struct Shadow_Effects_SoftShadows_Blur0_Vertex_Shader_VS_OUTPUT {
   float4 Pos: POSITION;
   float2 texCoord: TEXCOORD;
};

Shadow_Effects_SoftShadows_Blur0_Vertex_Shader_VS_OUTPUT Shadow_Effects_SoftShadows_Blur0_Vertex_Shader_main(float4 Pos: POSITION){
   Shadow_Effects_SoftShadows_Blur0_Vertex_Shader_VS_OUTPUT Out;
   
   // Clean up inaccuracies
   Pos.xy = sign(Pos.xy);
   Out.Pos = float4(Pos.xy, 0, 1);
   // Image-space
   Out.texCoord.x = 0.5 * (1 + Pos.x);
   Out.texCoord.y = 0.5 * (1 - Pos.y);

   return Out;
}



float sampleDist0
<
   string UIName = "sampleDist0";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 0.20;
> = float( 0.42 );
float depthBlur
<
   string UIName = "depthBlur";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 15.00;
> = float( 6.45 );
sampler Dilate = sampler_state
{
   Texture = (Dilate_Tex);
   ADDRESSU = CLAMP;
   ADDRESSV = CLAMP;
   MAGFILTER = LINEAR;
   MINFILTER = LINEAR;
   MIPFILTER = LINEAR;
};
sampler Shadow = sampler_state
{
   Texture = (Shadow_Tex);
   ADDRESSU = CLAMP;
   ADDRESSV = CLAMP;
   MAGFILTER = LINEAR;
   MINFILTER = LINEAR;
   MIPFILTER = LINEAR;
};
const float2 Shadow_Effects_SoftShadows_Blur0_Pixel_Shader_samples[12] = {
   -0.326212, -0.405805,
   -0.840144, -0.073580,
   -0.695914,  0.457137,
   -0.203345,  0.620716,
    0.962340, -0.194983,
    0.473434, -0.480026,
    0.519456,  0.767022,
    0.185461, -0.893124,
    0.507431,  0.064425,
    0.896420,  0.412458,
   -0.321940, -0.932615,
   -0.791559, -0.597705,
};

float4 Shadow_Effects_SoftShadows_Blur0_Pixel_Shader_main(float2 texCoord: TEXCOORD) : COLOR {
   float4 sum = tex2D(Shadow, texCoord);
   // Blur filter kernel size
   float x = tex2D(Dilate, texCoord).r;
   float size = sampleDist0 * pow(x, depthBlur);

   for (int i = 0; i < 12; i++){
      sum += tex2D(Shadow, texCoord + size * Shadow_Effects_SoftShadows_Blur0_Pixel_Shader_samples);
   }
   return sum / 13;
}


//--------------------------------------------------------------//
// Blur1
//--------------------------------------------------------------//
string Shadow_Effects_SoftShadows_Blur1_ScreenAlignedQuad : ModelData = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Models\\ScreenAlignedQuad.3ds";

texture Blur1_Tex : RenderColorTarget
<
   float2 RenderTargetDimensions = {512,512};
   string Format="D3DFMT_A8R8G8B8";
   float  ClearDepth=1.000000;
   int    ClearColor=0;
>;
float4x4 Shadow_Effects_SoftShadows_Blur1_Vertex_Shader_view_proj_matrix;
struct Shadow_Effects_SoftShadows_Blur1_Vertex_Shader_VS_OUTPUT {
   float4 Pos: POSITION;
   float2 texCoord: TEXCOORD;
};

Shadow_Effects_SoftShadows_Blur1_Vertex_Shader_VS_OUTPUT Shadow_Effects_SoftShadows_Blur1_Vertex_Shader_main(float4 Pos: POSITION){
   Shadow_Effects_SoftShadows_Blur1_Vertex_Shader_VS_OUTPUT Out;
   
   // Clean up inaccuracies
   Pos.xy = sign(Pos.xy);
   Out.Pos = float4(Pos.xy, 0, 1);
   // Image-space
   Out.texCoord.x = 0.5 * (1 + Pos.x);
   Out.texCoord.y = 0.5 * (1 - Pos.y);

   return Out;
}



float sampleDist1
<
   string UIName = "sampleDist1";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 0.20;
> = float( 0.16 );
float Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_depthBlur
<
   string UIName = "Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_depthBlur";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 15.00;
> = float( 6.45 );
sampler Blur0 = sampler_state
{
   Texture = (Blur0_Tex);
   ADDRESSU = CLAMP;
   ADDRESSV = CLAMP;
   MAGFILTER = LINEAR;
   MINFILTER = LINEAR;
   MIPFILTER = LINEAR;
};
sampler Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_Dilate = sampler_state
{
   Texture = (Dilate_Tex);
   ADDRESSU = CLAMP;
   ADDRESSV = CLAMP;
   MAGFILTER = LINEAR;
   MINFILTER = LINEAR;
   MIPFILTER = LINEAR;
};
const float2 Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_samples[12] = {
   -0.326212, -0.405805,
   -0.840144, -0.073580,
   -0.695914,  0.457137,
   -0.203345,  0.620716,
    0.962340, -0.194983,
    0.473434, -0.480026,
    0.519456,  0.767022,
    0.185461, -0.893124,
    0.507431,  0.064425,
    0.896420,  0.412458,
   -0.321940, -0.932615,
   -0.791559, -0.597705,
};

float4 Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_main(float2 texCoord: TEXCOORD) : COLOR {
   float4 sum = tex2D(Blur0, texCoord);
   // Blur filter kernel size
   float x = tex2D(Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_Dilate, texCoord).r;
   float size = sampleDist1 * pow(x, Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_depthBlur);

   for (int i = 0; i < 12; i++){
      sum += tex2D(Blur0, texCoord + size * Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_samples);
   }
   return sum / 13;
}


//--------------------------------------------------------------//
// Plane
//--------------------------------------------------------------//
string Shadow_Effects_SoftShadows_Plane_ScreenAlignedQuad : ModelData = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Models\\ScreenAlignedQuad.3ds";

float4x4 Shadow_Effects_SoftShadows_Plane_Vertex_Shader_view_proj_matrix : ViewProjection;
float Shadow_Effects_SoftShadows_Plane_Vertex_Shader_planeZ
<
   string UIName = "Shadow_Effects_SoftShadows_Plane_Vertex_Shader_planeZ";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = -100.00;
   float UIMax = 0.00;
> = float( -59.00 );
float4 Shadow_Effects_SoftShadows_Plane_Vertex_Shader_lightPos
<
   string UIName = "Shadow_Effects_SoftShadows_Plane_Vertex_Shader_lightPos";
   string UIWidget = "Direction";
   bool UIVisible =  true;
   float4 UIMin = float4( -400.00, -400.00, -400.00, -400.00 );
   float4 UIMax = float4( 400.00, 400.00, 400.00, 400.00 );
   bool Normalize =  false;
> = float4( -62.00, 104.00, 60.00, 0.00 );
float4 Shadow_Effects_SoftShadows_Plane_Vertex_Shader_view_position : ViewPosition;
float Shadow_Effects_SoftShadows_Plane_Vertex_Shader_planeSize
<
   string UIName = "Shadow_Effects_SoftShadows_Plane_Vertex_Shader_planeSize";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 1000.00;
> = float( 500.00 );
struct Shadow_Effects_SoftShadows_Plane_Vertex_Shader_VS_OUTPUT {
   float4 Pos:      POSITION;
   float2 texCoord: TEXCOORD0;
   float3 normal:   TEXCOORD1;
   float3 lightVec: TEXCOORD2;
   float3 viewVec:  TEXCOORD3;
};

Shadow_Effects_SoftShadows_Plane_Vertex_Shader_VS_OUTPUT Shadow_Effects_SoftShadows_Plane_Vertex_Shader_main(float4 Pos: POSITION, float3 normal: NORMAL){
   Shadow_Effects_SoftShadows_Plane_Vertex_Shader_VS_OUTPUT Out;

   // Image-space
   Out.texCoord.x = 0.5 * (1 + Pos.x);
   Out.texCoord.y = 0.5 * (1 - Pos.y);

   // Put the plane into place
   Pos.xy *= Shadow_Effects_SoftShadows_Plane_Vertex_Shader_planeSize;
   Pos.z = Shadow_Effects_SoftShadows_Plane_Vertex_Shader_planeZ;

   Out.Pos = mul(Shadow_Effects_SoftShadows_Plane_Vertex_Shader_view_proj_matrix, Pos);
   // World-space lighting
   Out.normal = normal;
   Out.lightVec = Shadow_Effects_SoftShadows_Plane_Vertex_Shader_lightPos - Pos.xyz;
   Out.viewVec  = Shadow_Effects_SoftShadows_Plane_Vertex_Shader_view_position - Pos.xyz;

   return Out;
}
















float ambient
<
   string UIName = "ambient";
   string UIWidget = "Numeric";
   bool UIVisible =  true;
   float UIMin = 0.00;
   float UIMax = 1.00;
> = float( 0.30 );
sampler Blur1 = sampler_state
{
   Texture = (Blur1_Tex);
   ADDRESSU = CLAMP;
   ADDRESSV = CLAMP;
   MAGFILTER = LINEAR;
   MINFILTER = LINEAR;
   MIPFILTER = LINEAR;
};
texture Floor_Tex
<
   string ResourceName = "..\\..\\..\\..\\..\\..\\..\\Program Files\\AMD\\RenderMonkey 1.81\\Examples\\Media\\Textures\\Wood.dds";
>;
sampler Floor = sampler_state
{
   Texture = (Floor_Tex);
   ADDRESSU = CLAMP;
   ADDRESSV = CLAMP;
   MAGFILTER = LINEAR;
   MINFILTER = LINEAR;
   MIPFILTER = LINEAR;
};
float4 Shadow_Effects_SoftShadows_Plane_Pixel_Shader_main(float2 texCoord: TEXCOORD0, float3 normal: TEXCOORD1, float3 lightVec: TEXCOORD2, float3 viewVec: TEXCOORD3) : COLOR {
   normal   = normalize(normal);
   lightVec = normalize(lightVec);
   viewVec  = normalize(viewVec);

   float4 base = tex2D(Floor, texCoord);

   // The last blur gives us the shadow factor
   float shadow = 1 - tex2D(Blur1, texCoord).r;

   // Basic lighting
   float diffuse = 0.5 + 0.5 * dot(lightVec, normal);
   float specular = pow(saturate(dot(reflect(-viewVec, normal), lightVec)), 16);

   return (shadow * diffuse + ambient) * base + 0.4 * shadow * specular;
}























































//--------------------------------------------------------------//
// Technique Section for Shadow Effects
//--------------------------------------------------------------//
technique SoftShadows
{
   pass Object
   {
      ZWRITEENABLE = TRUE;
      CULLMODE = CCW;

      VertexShader = compile vs_1_1 Shadow_Effects_SoftShadows_Object_Vertex_Shader_main();
      PixelShader = compile ps_2_0 Shadow_Effects_SoftShadows_Object_Pixel_Shader_main();
   }

   pass Light
   {
      CULLMODE = CCW;

      VertexShader = compile vs_1_1 Shadow_Effects_SoftShadows_Light_Vertex_Shader_main();
      PixelShader = compile ps_2_0 Shadow_Effects_SoftShadows_Light_Pixel_Shader_main();
   }

   pass Depth
   <
      string Script = "RenderColorTarget0 = Depth_Tex;"
                      "ClearColor = (0, 0, 0, 0);"
                      "ClearDepth = 1.000000;";
   >
   {
      ZWRITEENABLE = FALSE;
      SRCBLEND = ONE;
      DESTBLEND = ONE;
      CULLMODE = NONE;
      ALPHABLENDENABLE = TRUE;
      BLENDOP = MAX;

      VertexShader = compile vs_1_1 Shadow_Effects_SoftShadows_Depth_Vertex_Shader_main();
      PixelShader = compile ps_2_0 Shadow_Effects_SoftShadows_Depth_Pixel_Shader_main();
   }

   pass Dilate
   <
      string Script = "RenderColorTarget0 = Dilate_Tex;"
                      "ClearColor = (0, 0, 0, 0);"
                      "ClearDepth = 1.000000;";
   >
   {
      ZWRITEENABLE = FALSE;
      CULLMODE = NONE;
      ALPHABLENDENABLE = FALSE;

      VertexShader = compile vs_1_1 Shadow_Effects_SoftShadows_Dilate_Vertex_Shader_main();
      PixelShader = compile ps_2_0 Shadow_Effects_SoftShadows_Dilate_Pixel_Shader_main();
   }

   pass Shadow
   <
      string Script = "RenderColorTarget0 = Shadow_Tex;"
                      "ClearColor = (0, 0, 0, 0);"
                      "ClearDepth = 1.000000;";
   >
   {
      ZWRITEENABLE = FALSE;
      CULLMODE = NONE;
      ALPHABLENDENABLE = FALSE;

      VertexShader = compile vs_1_1 Shadow_Effects_SoftShadows_Shadow_Vertex_Shader_main();
      PixelShader = compile ps_2_0 Shadow_Effects_SoftShadows_Shadow_Pixel_Shader_main();
   }

   pass Blur0
   <
      string Script = "RenderColorTarget0 = Blur0_Tex;"
                      "ClearColor = (0, 0, 0, 0);"
                      "ClearDepth = 1.000000;";
   >
   {
      CULLMODE = NONE;

      VertexShader = compile vs_1_1 Shadow_Effects_SoftShadows_Blur0_Vertex_Shader_main();
      PixelShader = compile ps_2_0 Shadow_Effects_SoftShadows_Blur0_Pixel_Shader_main();
   }

   pass Blur1
   <
      string Script = "RenderColorTarget0 = Blur1_Tex;"
                      "ClearColor = (0, 0, 0, 0);"
                      "ClearDepth = 1.000000;";
   >
   {
      VertexShader = compile vs_1_1 Shadow_Effects_SoftShadows_Blur1_Vertex_Shader_main();
      PixelShader = compile ps_2_0 Shadow_Effects_SoftShadows_Blur1_Pixel_Shader_main();
   }

   pass Plane
   {
      ZWRITEENABLE = TRUE;
      CULLMODE = NONE;
      ALPHABLENDENABLE = FALSE;

      VertexShader = compile vs_1_1 Shadow_Effects_SoftShadows_Plane_Vertex_Shader_main();
      PixelShader = compile ps_2_0 Shadow_Effects_SoftShadows_Plane_Pixel_Shader_main();
   }

}

This topic is closed to new replies.

Advertisement