= 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 ***/ ]]>