@@ -5,6 +5,11 @@ struct PS_OUTPUT
55 float4 color: SV_TARGET ;
66};
77
8+ float g1v (float dotNV, float k)
9+ {
10+ return 1.0 / (dotNV * (1.0 - k) + 1.0 );
11+ }
12+
813PS_OUTPUT main (BASIC_PS_INPUT input)
914{
1015 PS_OUTPUT output;
@@ -14,10 +19,42 @@ PS_OUTPUT main(BASIC_PS_INPUT input)
1419 const float3 normal = normalize (input.normal);
1520 const float3 h = normalize (eye + light);
1621
17- float d = saturate (dot (normal, light));
22+ /* float d = saturate(dot(normal, light));
1823 float s = saturate(pow(dot(normal, h), 80.0));
24+ float3 blinn_phong = diffuse * d + s;*/
25+
26+ // blend between dielectric and metal
27+ const float f0 = 0.03 ;
28+ float3 specularColor = lerp (float3 (1.0 , 1.0 , 1.0 ), albedo, metalness);
29+ float3 finalAlbedo = albedo * (1.0 - metalness);
30+
31+ // precompute all cosines
32+ float dotLH = saturate (dot (light, h));
33+ float dotNH = saturate (dot (normal, h));
34+ float dotNL = saturate (dot (normal, light));
35+ float dotNV = saturate (dot (normal, eye));
36+
37+ // simple lambert for diffuse
38+ float3 diffuse = dotNL * finalAlbedo;
39+
40+ // schlick fresnel approximation
41+ float fresnel = f0 + (1.0 - f0) * pow (1.0 - dotNV, 5.0 );
42+
43+ float alpha = roughness * roughness;
44+ float alphaSquared = alpha * alpha;
45+
46+ // GGX normal distribution
47+ float denominator = dotNH * dotNH * (alphaSquared - 1.0 ) + 1.0 ;
48+ float normalDistribution = alphaSquared / (3.141592 * denominator * denominator);
49+
50+ // schlick approximation for geometry factor
51+ float k = alpha * 0.5 ;
52+ float geometryFactor = g1v (dotNL, k) * g1v (dotNV, k);
53+
54+ // cook-torrance microfacet model
55+ float3 specular = specularColor * dotNL * fresnel * normalDistribution * geometryFactor;
1956
20- output.color = float4 (diffuse * d + s , 1.0 );
57+ output.color = float4 (( diffuse + specular) * 10.0 , 1.0 );
2158
2259 return output;
2360}
0 commit comments