#include "Macros.fxh" DECLARE_TEXTURE(gPosition, 0); DECLARE_TEXTURE(gAlbedo, 1); DECLARE_TEXTURE(gNormal, 2); BEGIN_CONSTANTS float3 EyePosition _ps(c0) _cb(c0); float3 DirectionalLightDirection _ps(c1) _cb(c1); float3 DirectionalLightColor _ps(c2) _cb(c2); float Softness _ps(c3) _cb(c3); END_CONSTANTS struct VertexInput { float4 Position : POSITION; float2 TexCoord : TEXCOORD; }; struct PixelInput { float4 Position : SV_POSITION; float2 TexCoord : TEXCOORD0; }; PixelInput main_vs(VertexInput input) { PixelInput output; output.Position = input.Position; output.TexCoord = input.TexCoord; return output; } float4 main_ps(PixelInput input) : SV_TARGET0 { float3 worldPosition = SAMPLE_TEXTURE(gPosition, input.TexCoord).rgb; float3 normal = SAMPLE_TEXTURE(gNormal, input.TexCoord).xyz; float3 albedo = SAMPLE_TEXTURE(gAlbedo, input.TexCoord).rgb; float3 V = normalize(EyePosition - worldPosition); float3 L = normalize(DirectionalLightDirection); float3 N = normalize(normal); float3 H = normalize(V + L); float NdotL = dot(N, L); float NdotH = max(dot(N, H), 0.0); float lightIntensity; if (Softness > 0.0) { lightIntensity = smoothstep(0, Softness, NdotL); } else { lightIntensity = (NdotL > 0.0) ? 1.0 : 0.0; } float3 light = lightIntensity * DirectionalLightColor; float specularIntensity = pow(NdotH * lightIntensity, 32 * 32); float specularSmooth = smoothstep(0.005, 0.01, specularIntensity); float3 specular = specularSmooth * float3(1.0, 1.0, 1.0); float rimColor = float3(1.0, 1.0, 1.0); float rimThreshold = 0.1; float rimAmount = 0.76; float rimDot = 1 - dot(V, N); float rimIntensity = rimDot * pow(max(NdotL, 0.0), rimThreshold); rimIntensity = smoothstep(rimAmount - 0.01, rimAmount + 0.01, rimIntensity); float3 rim = rimIntensity * rimColor; float3 color = albedo * (light + specular + rim); return float4(color, 1.0); } Technique Deferred_Toon { Pass { VertexShader = compile vs_3_0 main_vs(); PixelShader = compile ps_3_0 main_ps(); } }