1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| #define LIGHTING_PHONG 1 #define LIGHTING_BLINN_PHONG 2 #define LIGHTING_PBR 3 #define LIGHTING_TOON 4
#ifndef LIGHTING_MODEL #define LIGHTING_MODEL LIGHTING_PBR #endif
vec3 lambertLighting(vec3 normal, vec3 lightDir, vec3 lightColor, vec3 albedo) { float NdotL = max(dot(normal, lightDir), 0.0); return albedo * lightColor * NdotL; }
vec3 phongLighting(vec3 normal, vec3 lightDir, vec3 viewDir, vec3 lightColor, vec3 albedo) { float NdotL = max(dot(normal, lightDir), 0.0); vec3 diffuse = albedo * lightColor * NdotL; vec3 reflectDir = reflect(-lightDir, normal); float RdotV = max(dot(reflectDir, viewDir), 0.0); vec3 specular = lightColor * pow(RdotV, 32.0); return diffuse + specular; }
vec3 blinnPhongLighting(vec3 normal, vec3 lightDir, vec3 viewDir, vec3 lightColor, vec3 albedo) { float NdotL = max(dot(normal, lightDir), 0.0); vec3 diffuse = albedo * lightColor * NdotL; vec3 halfDir = normalize(lightDir + viewDir); float NdotH = max(dot(normal, halfDir), 0.0); vec3 specular = lightColor * pow(NdotH, 32.0); return diffuse + specular; }
float metallic = 0.0; float roughness = 0.5; vec3 F0 = mix(vec3(0.04), albedo, metallic); vec3 H = normalize(lightDir + viewDir); float NdotL = max(dot(normal, lightDir), 0.0); float NdotV = max(dot(normal, viewDir), 0.0); float NdotH = max(dot(normal, H), 0.0); float VdotH = max(dot(viewDir, H), 0.0); float alpha = roughness * roughness; float D = alpha * alpha / (3.14159 * pow(NdotH * NdotH * (alpha * alpha - 1.0) + 1.0, 2.0)); vec3 F = F0 + (1.0 - F0) * pow(1.0 - VdotH, 5.0); vec3 kS = F; vec3 kD = (1.0 - kS) * (1.0 - metallic); vec3 diffuse = kD * albedo / 3.14159; vec3 specular = D * F / (4.0 * NdotV * NdotL + 0.001); return (diffuse + specular) * lightColor * NdotL; }
float NdotL = dot(normal, lightDir); float toonFactor; if (NdotL > 0.8) toonFactor = 1.0; else if (NdotL > 0.4) toonFactor = 0.7; else if (NdotL > 0.2) toonFactor = 0.4; else toonFactor = 0.1; return albedo * lightColor * toonFactor; }
#if LIGHTING_MODEL == LIGHTING_LAMBERT #define calculateLighting(n, l, v, lc, a) lambertLighting(n, l, lc, a) #elif LIGHTING_MODEL == LIGHTING_PHONG #define calculateLighting(n, l, v, lc, a) phongLighting(n, l, v, lc, a) #elif LIGHTING_MODEL == LIGHTING_BLINN_PHONG #define calculateLighting(n, l, v, lc, a) blinnPhongLighting(n, l, v, lc, a) #elif LIGHTING_MODEL == LIGHTING_PBR #define calculateLighting(n, l, v, lc, a) pbrLighting(n, l, v, lc, a) #elif LIGHTING_MODEL == LIGHTING_TOON #define calculateLighting(n, l, v, lc, a) toonLighting(n, l, v, lc, a) #else #define calculateLighting(n, l, v, lc, a) lambertLighting(n, l, lc, a) #endif
|