float Script : STANDARDSGLOBAL < string UIWidget = "none"; string ScriptClass = "object"; string ScriptOrder = "standard"; string ScriptOutput = "color"; string Script = "Technique=Technique?Untextured:Textured;"; > = 0.8; float4x4 WorldIT : WorldInverseTranspose < string UIWidget="None"; >; float4x4 WorldViewProj : WorldViewProjection < string UIWidget="None"; >; float4x4 World : World < string UIWidget="None"; >; float4x4 ViewInv : ViewInverse < string UIWidget="None"; >; float4 LightPos : Position < string Object = "PointLight"; string Space = "Object"; > = {-10.0f, 10.0f, -10.0f, 0.0f}; float3 LiteColor : Diffuse < string UIName = "Bright Surface Color"; string UIWidget = "Color"; > = {0.8f, 0.5f, 0.1f}; float3 DarkColor : Diffuse < string UIName = "Dark Surface Color"; string UIWidget = "Color"; > = {0.0f, 0.0f, 0.0f}; float3 WarmColor : Diffuse < string UIName = "Gooch warm tone"; string UIWidget = "Color"; > = {0.5f, 0.4f, 0.05f}; float3 CoolColor : Diffuse < 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; texture ColorMap : Diffuse < string ResourceName = "default_color.dds"; string ResourceType = "2D"; >; sampler2D ColorSampler = sampler_state { Texture = ; MinFilter = LinearMipMapLinear; MagFilter = Linear; WrapS = Repeat; WrapT = Repeat; }; struct appdata { float3 Position : POSITION; float4 UV : TEXCOORD0; float4 Normal : NORMAL; }; struct vertexOutput { float4 HPosition : POSITION; float4 TexCoord : TEXCOORD0; float3 LightVec : TEXCOORD1; float3 WorldNormal : TEXCOORD2; float3 WorldPos : TEXCOORD3; float3 WorldEyePos : TEXCOORD4; }; vertexOutput mainVS(appdata IN) { vertexOutput OUT; OUT.WorldNormal = mul(WorldIT, IN.Normal).xyz; float4 Po = float4(IN.Position.xyz, 1); // float3 Pw = mul(World, Po).xyz; // OUT.WorldPos = Pw; // OUT.LightVec = LightPos - Pw; OUT.LightVec = LightPos - Po; OUT.TexCoord = IN.UV; // OUT.WorldEyePos = ViewInv[3].xyz; OUT.WorldEyePos = float3(ViewInv[0].w, ViewInv[1].w, ViewInv[2].w); OUT.HPosition = mul(WorldViewProj, Po); return OUT; } void gooch_shared(vertexOutput IN, out float4 DiffuseContrib, out float4 SpecularContrib) { float3 Ln = normalize(IN.LightVec); float3 Nn = normalize(IN.WorldNormal); float3 Vn = normalize(IN.WorldEyePos - IN.WorldPos); float3 Hn = normalize(Vn + Ln); float hdn = pow(max(0, dot(Hn, Nn)), SpecExpon); hdn = hdn * (GlossDrop + smoothstep(GlossBot, GlossTop, hdn) * (1.0 - GlossDrop)); SpecularContrib = 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); DiffuseContrib = float4((surfColor + toneColor), 1); } float4 gooch_PS(vertexOutput IN) :COLOR { float4 diffContrib; float4 specContrib; gooch_shared(IN,diffContrib, specContrib); float4 result = diffContrib + specContrib; return result; } float4 goochT_PS(vertexOutput IN) :COLOR { float4 diffContrib; float4 specContrib; gooch_shared(IN, diffContrib, specContrib); float4 result = tex2D(ColorSampler, IN.TexCoord.xy) * diffContrib + specContrib; return result; } technique Untextured < string Script = "Pass=p0;"; > { pass p0 < string Script = "Draw=geometry;"; > { CullFace = Back; DepthTestEnable=true; DepthFunc = LEqual; VertexProgram = compile arbvp1 mainVS(); FragmentProgram = compile arbfp1 gooch_PS(); } } technique Textured < string Script = "Pass=p0;"; > { pass p0 < string Script = "Draw=geometry;"; > { CullFace = Back; DepthTestEnable=true; DepthFunc = LEqual; VertexProgram = compile arbvp1 mainVS(); FragmentProgram = compile arbfp1 goochT_PS(); } }