Phong: en.wikipedia.org/wiki/phong_reflection_model and learnopengl.com/lighting/basic-lighting
#phong #lighting
Log in to post a comment.
#version 300 es precision highp float; uniform vec2 iResolution; uniform vec3 diffuse; // value=.75,0,0 uniform vec3 specular; // value=.5,.5,.5 uniform vec3 ambient; // value=0.1,0,0 uniform float shininess; // value=16, min=0, max=100, step=0.001 in vec2 vScreen; out vec4 fragColor; const float PI = 3.14159265359; // https://www.shadertoy.com/view/4d2XWV by Inigo Quilez float sphereIntersect(vec3 ro, vec3 rd, vec4 sph) { vec3 oc = ro - sph.xyz; float b = dot( oc, rd ); float c = dot( oc, oc ) - sph.w*sph.w; float h = b*b - c; if( h<0.0 ) return -1.0; return -b - sqrt( h ); } void main (){ vec3 lightPos = vec3(1.25, 1.0, -2); vec3 lightColor = vec3(1); vec3 totColor = vec3(0.0); vec3 ro = vec3(0.0, 0.0, -2.0); for (float x = 0.0; x <= 1.0; x += 1.) { for (float y = 0.0; y <= 1.0; y += 1.) { vec3 rd = normalize(vec3(vScreen + vec2(x, y) / iResolution.y, 1.2)); float d = sphereIntersect(ro, rd, vec4(0,0,0,1)); if (d > 0.) { vec3 worldPos = ro + d * rd; vec3 N = normalize (worldPos); vec3 V = -rd; vec3 L = normalize (lightPos - worldPos); vec3 R = reflect (-L, N); // Phong reflection model float spec = pow(max(dot(R, V), 0.0), shininess); float diff = max(dot(N, L), 0.0); float intensity = (1. / dot(lightPos - worldPos, lightPos - worldPos)); vec3 color = pow(ambient, vec3(2.2)) + lightColor * pow(diffuse, vec3(2.2)) * diff * intensity + lightColor * pow(specular, vec3(2.2)) * spec * intensity; totColor += color; } } } // HDR tonemapping gamma correct fragColor = vec4(pow(totColor/(totColor + 1.0), vec3 (1.0/2.2)), 1.0); }