   Integrating exported RenderMonkey .fx file into DirectX.
  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;boolkeys[256];boolactive=TRUE;boolfullscreen=TRUE;#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)IDirect3DVertexBuffer9 *pVertexBuffer = NULL;  // Our Vertex Bufferstruct 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 }};LRESULTCALLBACK 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 LightpD3DDevice->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 MatrixD3DXMATRIX matRotX;// Create X Axis Rotation MatrixD3DXMATRIX matRotY;// Create Y Axis Rotation MatrixD3DXMATRIX matRotZ;// Create Z Axis Rotation MatrixD3DXMATRIX matRotXYZ;// Create XYZ Rotation Matrix    D3DXMatrixTranslation( &matTranslation, 0.0f, 0.0f, 5.0f ); // Translate The Cube 5 Units Into The ScreenD3DXMatrixRotationY(&matRotY, D3DXToRadian(rotqube));// Rotate In Y DirectionD3DXMatrixRotationX(&matRotX, D3DXToRadian(rotqube));// Rotate In X DirectionD3DXMatrixRotationY(&matRotY, D3DXToRadian(rotqube));// Rotate In Z DirectionD3DXMatrixRotationZ(&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 FrontpD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,  4, 2 ); // Draw BackpD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,  8, 2 ); // Draw ToppD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 12, 2 ); // Draw BottompD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 16, 2 ); // Draw RightpD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 20, 2 ); // Draw LeftpD3DDevice->EndScene();// End Direct3D ScenepD3DDevice->Present( NULL, NULL, NULL, NULL );// Display The Resultreturn TRUE;}void KillD3DScene() {    if( pVertexBuffer != NULL ){ pVertexBuffer->Release();// Release The Vertex BufferpVertexBuffer = NULL;}}void KillD3DWindow()// Properly Kill The Window{KillD3DScene();// Release D3D Scene    if (pD3DDevice != NULL)pD3DDevice->Release();// Release D3D Deviceif (pD3D != NULL) pD3D->Release();// Release D3D Interfaceif (fullscreen)// Are We In Fullscreen Mode?{ChangeDisplaySettings(NULL,0);// If So Switch Back To The DesktopShowCursor(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){WNDCLASSwc;DWORDdwExStyle;// Window Extended StyleDWORDdwStyle;// Window StyleRECTWindowRect;// Grabs Rectangle Upper Left / Lower Right ValuesWindowRect.left=(long)0;// Set Left Value To 0WindowRect.right=(long)width;// Set Right Value To Requested WidthWindowRect.top=(long)0;// Set Top Value To 0WindowRect.bottom=(long)height;// Set Bottom Value To Requested Heightfullscreen=fullscreenflag;// Set The Global Fullscreen FlaghInstance= GetModuleHandle(NULL);// Grab An Instance For Our Windowwc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;// Redraw On Size, And Own DC For Window.wc.lpfnWndProc= (WNDPROC) WndProc;// WndProc Handles Messageswc.cbClsExtra= 0;// No Extra Window Datawc.cbWndExtra= 0;// No Extra Window Datawc.hInstance= hInstance;// Set The Instancewc.hIcon= LoadIcon(NULL, IDI_WINLOGO);// Load The Default Iconwc.hCursor= LoadCursor(NULL, IDC_ARROW);// Load The Arrow Pointerwc.hbrBackground= NULL;// No Background Required For D3Dwc.lpszMenuName= NULL;// We Don't Want A Menuwc.lpszClassName= "Direct3D";// Set The Class Nameif (!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 StyledwStyle=WS_POPUP;// Windows StyleShowCursor(FALSE);// Hide Mouse Pointer}else{dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;// Window Extended StyledwStyle=WS_OVERLAPPEDWINDOW;// Windows Style}AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);// Adjust Window To True Requested Size// Create The Windowif (!(hWnd=CreateWindowEx(dwExStyle,// Extended Style For The Window"Direct3D",// Class Nametitle,// Window TitledwStyle |// Defined Window StyleWS_CLIPSIBLINGS |// Required Window StyleWS_CLIPCHILDREN,// Required Window Style0, 0,// Window PositionWindowRect.right-WindowRect.left,// Calculate Window WidthWindowRect.bottom-WindowRect.top,// Calculate Window HeightNULL,// No Parent WindowNULL,// No MenuhInstance,// InstanceNULL)))// Dont Pass Anything To WM_CREATE{KillD3DWindow();// Reset The DisplayMessageBox(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 DisplayMessageBox(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 versionif ( pD3D == NULL ){KillD3DWindow();// Reset The DisplayMessageBox(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 Widthheight,// Back Buffer HeightD3DFMT_R5G6B5,// Back Buffer Format (Color Depth)1,// Back Buffer Count (Double Buffer)D3DMULTISAMPLE_NONE,// Multi Sample Type0,// Multi Sample QualityD3DSWAPEFFECT_DISCARD,// Swap Effect (Fast)hWnd,// The Window Handle!fullscreen,// Windowed or FullscreenTRUE,// Enable Auto Depth Stencil  D3DFMT_D16,// 16Bit Z-Buffer (Depth Buffer)0,// No FlagsD3DPRESENT_RATE_DEFAULT,// Default Refresh RateD3DPRESENT_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 DisplayMessageBox(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 DisplayMessageBox(NULL,"Can't Create DirectX 3D Device.","ERROR",MB_OK|MB_ICONEXCLAMATION);return FALSE;}ShowWindow(hWnd,SW_SHOW);// Show The WindowSetForegroundWindow(hWnd);// Slightly Higher PrioritySetFocus(hWnd);// Sets Keyboard Focus To The WindowReSizeD3DScene(width, height);// Set Up Our Perspective D3D Screenif (!InitD3D())// Initialize Our Newly Created D3D Window{KillD3DWindow();// Reset The DisplayMessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);return FALSE;// Return FALSE}return TRUE;}LRESULT CALLBACK WndProc(HWNDhWnd, UINTuMsg, WPARAMwParam, LPARAMlParam ){    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 Messagereturn 0;// Jump Back}case WM_KEYDOWN:// Is A Key Being Held Down?{keys[wParam] = TRUE;// If So, Mark It As TRUEreturn 0;// Jump Back}case WM_KEYUP:// Has A Key Been Released?{keys[wParam] = FALSE;// If So, Mark It As FALSEreturn 0;// Jump Back}case WM_SIZE:// Resize The Direct3D Window{if(!fullscreen)ReSizeD3DScene(LOWORD(lParam), HIWORD(lParam));  // LoWord=Width, HiWord=Heightreturn 0;// Jump Back}}// Pass All Unhandled Messages To DefWindowProcreturn DefWindowProc(hWnd,uMsg,wParam,lParam);}int WINAPI WinMain( HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow ){MSGmsg;BOOLdone=FALSE;// Bool Variable To Exit Loop// Ask The User Which Screen Mode They Preferif (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 Windowif (!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 MessageDispatchMessage(&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 FALSEKillD3DWindow();// Kill Our Current Windowfullscreen=!fullscreen;// Toggle Fullscreen / Windowed Mode// Recreate Our DirectX 3D Windowif (!CreateD3DWindow("APRON TUTORIALS",640,480,fullscreen)){return 0;// Quit If Window Was Not Created}}}}// ShutdownKillD3DWindow();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();   }}