= 0.8;
/************* UNTWEAKABLES **************/
float4x4 WorldITXf : WorldInverseTranspose < string UIWidget="None"; >;
float4x4 WvpXf : WorldViewProjection < string UIWidget="None"; >;
float4x4 WorldXf : World < string UIWidget="None"; >;
float4x4 ViewInvXf : ViewInverse < string UIWidget="None"; >;
/************* TWEAKABLES **************/
float4 LightPos : Position
<
string Object = "PointLight";
string Space = "World";
> = {100.0f, 100.0f, 100.0f, 0.0f};
////////////////
float3 LiteColor <
string UIName = "Bright Surface Color";
string UIWidget = "Color";
> = {0.8f, 0.5f, 0.1f};
float3 DarkColor <
string UIName = "Dark Surface Color";
string UIWidget = "Color";
> = {0.0f, 0.0f, 0.0f};
float3 WarmColor <
string UIName = "Gooch warm tone";
string UIWidget = "Color";
> = {0.5f, 0.4f, 0.05f};
float3 CoolColor <
string UIName = "Gooch cool tone";
string UIWidget = "Color";
> = {0.05f, 0.05f, 0.6f};
float3 SpecColor : Specular <
string UIName = "Hilight color";
string UIWidget = "Color";
> = {0.7f, 0.7f, 1.0f};
float SpecExpon : SpecularPower <
string UIWidget = "slider";
float UIMin = 1.0;
float UIMax = 128.0;
float UIStep = 1.0;
string UIName = "specular power";
> = 40.0;
float GlossTop <
string UIWidget = "slider";
float UIMin = 0.2;
float UIMax = 1.0;
float UIStep = 0.05;
string UIName = "Maximum for Gloss Dropoff";
> = 0.7;
float GlossBot
<
string UIWidget = "slider";
float UIMin = 0.05;
float UIMax = 0.95;
float UIStep = 0.05;
string UIName = "Minimum for Gloss Dropoff";
> = 0.5;
float GlossDrop
<
string UIWidget = "slider";
float UIMin = 0.0;
float UIMax = 1.0;
float UIStep = 0.05;
string UIName = "Strength of Glossy Dropoff";
> = 0.2;
float4x4 SlicerXf : View <
//string UIName = "Slicer Transform";
//string Object = "SpotLight0";
string frustum = "light0";
>;
//////////////////////////
/* data from application vertex buffer */
struct appdata {
float3 Position : POSITION;
float4 UV : TEXCOORD0;
float4 Normal : NORMAL;
};
/* data passed from vertex shader to pixel shader */
struct vertexOutput {
float4 HPosition : POSITION;
float4 TexCoord : TEXCOORD0;
float3 LightVec : TEXCOORD1;
float3 WorldNormal : TEXCOORD2;
float3 WorldPos : TEXCOORD3;
float3 WorldView : TEXCOORD4;
float3 SlicePos : TEXCOORD5;
};
/*********** vertex shader ******/
vertexOutput mainVS(appdata IN)
{
vertexOutput OUT;
OUT.WorldNormal = mul(IN.Normal, WorldITXf).xyz;
float4 Po = float4(IN.Position.xyz,1);
float3 Pw = mul(Po, WorldXf).xyz;
float3 Ps = mul(Po, SlicerXf).xyz;
OUT.WorldPos = Pw;
OUT.SlicePos = Ps;
OUT.LightVec = LightPos - Pw;
OUT.TexCoord = IN.UV;
OUT.WorldView = ViewInvXf[3].xyz - Pw;
OUT.HPosition = mul(Po, WvpXf);
return OUT;
}
/*********** pixel shader ******/
float4 slicerPS(vertexOutput IN) :COLOR
{
float3 Ln = normalize(IN.LightVec);
float3 Vn = normalize(IN.WorldView);
float3 Nn = normalize(IN.WorldNormal);
Nn = faceforward(Nn,-Vn,Nn);
float3 Hn = normalize(Vn + Ln);
float hdn = pow(max(0,dot(Hn,Nn)),SpecExpon);
hdn = hdn * (GlossDrop+smoothstep(GlossBot,GlossTop,hdn)*(1.0-GlossDrop));
float4 specContrib = float4((hdn * SpecColor),1);
float ldn = dot(Ln,Nn);
float mixer = 0.5 * (ldn + 1.0);
float diffComp = max(0,ldn);
float3 surfColor = lerp(DarkColor,LiteColor,mixer);
float3 toneColor = lerp(CoolColor,WarmColor,mixer);
float4 diffContrib = float4((surfColor + toneColor),1);
float4 result = diffContrib + specContrib;
clip(IN.SlicePos.zzz);
return result;
}
/*************/
technique Slicer <
string Script = "Pass=p0;";
> {
pass p0 <
string Script = "Draw=geometry;";
> {
VertexShader = compile vs_2_0 mainVS();
ZEnable = true;
ZWriteEnable = true;
CullMode = None;
PixelShader = compile ps_2_0 slicerPS();
}
}
/***************************** eof ***/
]]>