diff options
author | pryazha <pryadeiniv@mail.ru> | 2025-03-18 11:31:31 +0500 |
---|---|---|
committer | pryazha <pryadeiniv@mail.ru> | 2025-03-18 11:31:31 +0500 |
commit | d65ddd07a43d5ffdcf2ddf90d6f86626cf9b92d8 (patch) | |
tree | 672efce6089ec9c1103be0c1b70a28ec415eeeab /advanced_lighting/6.hdr/shaders/blinn.frag | |
parent | d64a159d05a45e75870f61c37f0defa94f03793e (diff) |
Diffstat (limited to 'advanced_lighting/6.hdr/shaders/blinn.frag')
-rw-r--r-- | advanced_lighting/6.hdr/shaders/blinn.frag | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/advanced_lighting/6.hdr/shaders/blinn.frag b/advanced_lighting/6.hdr/shaders/blinn.frag new file mode 100644 index 0000000..5dca1f7 --- /dev/null +++ b/advanced_lighting/6.hdr/shaders/blinn.frag @@ -0,0 +1,54 @@ +#version 330 core + +in VS_OUT { + vec3 fpos; + vec3 fn; + vec2 texc; +} fsin; + +out vec4 fcolor; + +uniform sampler2D diftex; + +const int lmax = 30; + +uniform int lcount; +uniform vec3 lpos[lmax]; +uniform vec3 vpos; + +void main(void) +{ + vec3 l, v, n, difcolor, lcolor, ambient, halfdir, result; + float diff, spec, specf, dist, attenuation; + int i; + + n = normalize(fsin.fn); + v = normalize(vpos-fsin.fpos); + + ambient = vec3(0.001); + + difcolor = vec3(texture(diftex, fsin.texc)); + + /* lcolor = vec3(0.3, 0.0, 0.1); */ + lcolor = vec3(1.0); + + specf = 0.2; + + result = vec3(0.0); + + for (i = 0; i < lcount; i++) { + l = normalize(lpos[i]-fsin.fpos); + halfdir = normalize(l+v); + + diff = max(dot(n, l), 0.0); + + spec = pow(max(dot(n, halfdir), 0.0), 16.0)*specf; + + dist = length(lpos[i]-fsin.fpos); + attenuation = 1.0/dist; + + result += (diff+spec)*difcolor*lcolor*attenuation; + } + + fcolor = vec4(ambient+result, 1.0); +} |