float Script : STANDARDSGLOBAL <
string UIWidget = "none";
string ScriptClass = "scene";
string ScriptOrder = "postprocess";
string ScriptOutput = "color";
string Script = "Technique=Main;";
> = 0.8; // version #
float4 ClearColor <
string UIWidget = "color";
string UIName = "background";
> = {0,0,0,0.0};
float ClearDepth = 1.0;
#ifdef HAS_FP16
#define FAR 1000.0f
#else
#define FAR 1.0f
#endif
float4 ShadowClearColor <
string UIWidget = "none";
> = {FAR,FAR,FAR,0.0};
/************* "UN-TWEAKABLES," TRACKED BY CPU APPLICATION **************/
float4x4 WorldITXf : WorldInverseTranspose ;
float4x4 WorldViewProjXf : WorldViewProjection ;
float4x4 WorldXf : World ;
float4x4 ViewIXf : ViewInverse ;
float4x4 WorldViewITXf : WorldViewInverseTranspose ;
float4x4 WorldViewXf : WorldView ;
float4x4 ViewXf : View ;
float4x4 ViewITXf : ViewInverseTranspose ;
float4x4 LampViewXf : View <
//string UIWidget="None";
string frustum = "light0";
>;
float4x4 LampProjXf : Projection <
//string UIWidget="None";
string frustum = "light0";
>;
///////////////////////////////////////////////////////////////
/// TWEAKABLES ////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
////////////////////////////////////////////// spot light
float3 SpotLightPos : POSITION <
string UIName = "Light Posistion";
string Object = "SpotLight";
string Space = "World";
> = {-1.0f, 1.0f, 0.0f};
float3 SpotLightColor : Diffuse <
string UIName = "Lamp";
string Object = "SpotLight";
string UIWidget = "Color";
> = {0.8f, 1.0f, 0.4f};
float SpotLightIntensity <
string UIName = "Light Intensity";
string UIWidget = "slider";
float UIMin = 0.0;
float UIMax = 2;
float UIStep = 0.1;
> = 1;
float SpotLightCone <
string UIWidget = "slider";
float UIMin = 0.0;
float UIMax = 90.5;
float UIStep = 0.1;
string UIName = "Cone Angle";
> = 45.0f;
////////////////////////////////////////////// ambient light
float3 AmbiLightColor : Ambient
<
string UIName = "Ambient";
> = {0.07f, 0.07f, 0.07f};
/////////////// Shadow and Aiming Parameters
float ShadBias <
string UIWidget = "slider";
float UIMin = 0.0;
float UIMax = 0.3;
float UIStep = 0.0001;
string UIName = "Shadow Bias";
> = 0.01;
////////////////////////////////////////////// surface
float3 SurfColor : Diffuse
<
string UIName = "Surface";
string UIWidget = "Color";
> = {1.0f, 0.7f, 0.3f};
float Kd
<
string UIWidget = "slider";
float UIMin = 0.0;
float UIMax = 1.5;
float UIStep = 0.01;
string UIName = "Diffuse";
> = 1.0;
float Ks
<
string UIWidget = "slider";
float UIMin = 0.0;
float UIMax = 1.5;
float UIStep = 0.01;
string UIName = "Specular";
> = 1.0;
float SpecExpon : SpecularPower
<
string UIWidget = "slider";
float UIMin = 1.0;
float UIMax = 128.0;
float UIStep = 1.0;
string UIName = "Specular power";
> = 12.0;
float PCFSize <
string UIWidget = "slider";
float UIMin = 0.001;
float UIMax = 0.1;
float UIStep = 0.001;
string UIName = "PCF Filter Width";
> = 0.01;
////////////////////////////////////////////////////////
/// TEXTURES ///////////////////////////////////////////
////////////////////////////////////////////////////////
#define SHADOW_SIZE 1024
//#ifdef HAS_FP16
//#define SHADOW_FMT "a16b16g16r16f"
#define SHADOW_FMT "r32f"
//#else /* !HAS_FP16 */
//#define SHADOW_FMT "a8b8g8r8"
//#endif /* !HAS_FP16 */
texture ShadMap : RENDERCOLORTARGET <
float2 Dimensions = { SHADOW_SIZE, SHADOW_SIZE };
string Format = (SHADOW_FMT) ;
string UIWidget = "None";
>;
sampler ShadSampler = sampler_state {
texture = ;
AddressU = CLAMP;
AddressV = CLAMP;
MipFilter = NONE;
MinFilter = POINT;
MagFilter = POINT;
};
texture ShadDepthTarget : RENDERDEPTHSTENCILTARGET <
float2 Dimensions = { SHADOW_SIZE, SHADOW_SIZE };
string format = "D24S8";
string UIWidget = "None";
>;
/////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/// SHADER CODE BEGINS /////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/* data from application vertex buffer */
struct ShadowAppData {
float3 Position : POSITION;
float4 UV : TEXCOORD0;
float4 Normal : NORMAL;
};
// Connector from vertex to pixel shader
struct ShadowVertexOutput {
float4 HPosition : POSITION;
float2 UV : TEXCOORD0;
float3 LightVec : TEXCOORD1;
float3 WNormal : TEXCOORD2;
float3 WView : TEXCOORD3;
float4 LP : TEXCOORD4; // current position in light-projection space
};
// Connector from vertex to pixel shader
struct JustShadowVertexOutput {
float4 HPosition : POSITION;
float4 LP : TEXCOORD0; // current position in light-projection space
};
////////////////////////////////////////////////////////////////////////////////
/// Vertex Shaders /////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
JustShadowVertexOutput shadVS(ShadowAppData IN,
uniform float4x4 ShadowViewProjXf // typically created from aimShadowProjXf()
) {
JustShadowVertexOutput OUT = (JustShadowVertexOutput)0;
float4 Po = float4(IN.Position.xyz,(float)1.0); // object coordinates
float4 Pw = mul(Po,WorldXf); // "P" in world coordinates
float4 Pl = mul(Pw,ShadowViewProjXf); // "P" in light coords
OUT.LP = Pl; // view coords (also lightspace projection coords in this case)
OUT.HPosition = Pl; // screen clipspace coords
return OUT;
}
// from scene camera POV
ShadowVertexOutput mainCamVS(ShadowAppData IN,
uniform float4x4 ShadowViewProjXf)
{
ShadowVertexOutput OUT = (ShadowVertexOutput)0;
OUT.WNormal = mul(IN.Normal,WorldITXf).xyz; // world coords
float4 Po = float4(IN.Position.xyz,(float)1.0); // "P" in object coordinates
float4 Pw = mul(Po,WorldXf); // "P" in world coordinates
float4 Pl = mul(Pw,ShadowViewProjXf); // "P" in light coords
OUT.LP = Pl; // ...for pixel-shader shadow calcs
OUT.WView = normalize(ViewIXf[3].xyz - Pw.xyz); // world coords
OUT.HPosition = mul(Po,WorldViewProjXf); // screen clipspace coords
OUT.UV = IN.UV.xy; // pass-thru
OUT.LightVec = SpotLightPos - Pw.xyz; // world coords
return OUT;
}
/*********************************************************/
/*********** pixel shader ********************************/
/*********************************************************/
float4 shadPS(JustShadowVertexOutput IN) : COLOR
{
return float4(IN.LP.zzz,1);
}
//
// Utility function for pixel shaders to use this shadow map
//
float shadow_calc(float4 LP, // current shaded point in light-projected coordinates
uniform sampler ShadowMapSampler, // obvious
uniform float ShadowBiasing
) {
float totalShad=0;
int i, j;
float offSize = PCFSize / (float)PCF_SAMPS;
for (i = -PCFH; i<= PCFH; i += 1) {
for (j = -PCFH; j<= PCFH; j += 1) {
float2 offset = float2(offSize*i,offSize*j);
float2 nuv = float2(.5,-.5)*(LP.xy+offset)/LP.w + float2(.5,.5);
float shadMapDepth = tex2D(ShadowMapSampler,nuv).x;
float depth = LP.z - ShadowBiasing;
float shad = 1-(shadMapDepth {
pass MakeShadow <
string Script = "RenderColorTarget0=ShadMap;"
"RenderDepthStencilTarget=ShadDepthTarget;"
"RenderPort=light0;"
"ClearSetColor=ShadowClearColor;"
"ClearSetDepth=ClearDepth;"
"Clear=Color;"
"Clear=Depth;"
"Draw=geometry;";
> {
VertexShader = compile vs_3_0 shadVS(mul(LampViewXf,LampProjXf));
ZEnable = true;
ZWriteEnable = true;
ZFunc = LessEqual;
CullMode = None;
PixelShader = compile ps_3_0 shadPS();
}
pass UseShadow <
string Script = "RenderColorTarget0=;"
"RenderDepthStencilTarget=;"
"RenderPort=;"
"ClearSetColor=ClearColor;"
"ClearSetDepth=ClearDepth;"
"Clear=Color;"
"Clear=Depth;"
"Draw=geometry;";
> {
VertexShader = compile vs_3_0 mainCamVS(mul(LampViewXf,LampProjXf));
ZEnable = true;
ZWriteEnable = true;
ZFunc = LessEqual;
CullMode = None;
PixelShader = compile ps_3_0 useShadowPS(cos(radians(SpotLightCone)));
}
}
/***************************** eof ***/
]]>; \
sampler SampName = sampler_state { \
texture = ; \
AddressU = AddrMode; \
AddressV = AddrMode; \
MipFilter = LINEAR; \
MinFilter = LINEAR; \
MagFilter = LINEAR; \
};
//
// Simple 2D File Textures
//