80 lines
2.0 KiB
Scala
80 lines
2.0 KiB
Scala
$input v_view, v_normal
|
|
|
|
/*
|
|
* Copyright 2014 Dario Manesku. All rights reserved.
|
|
* License: http://www.opensource.org/licenses/BSD-2-Clause
|
|
*/
|
|
|
|
#include "../common/common.sh"
|
|
|
|
uniform float u_time;
|
|
uniform vec4 u_params;
|
|
uniform mat4 u_mtx;
|
|
uniform vec4 u_flags;
|
|
uniform vec3 u_camPos;
|
|
uniform vec3 u_rgbDiff;
|
|
uniform vec3 u_rgbSpec;
|
|
|
|
SAMPLERCUBE(u_texCube, 4);
|
|
SAMPLERCUBE(u_texCubeIrr, 5);
|
|
|
|
#define u_glossiness u_params.x
|
|
#define u_exposure u_params.y
|
|
#define u_diffspec u_params.z
|
|
|
|
#define u_doDiffuse u_flags.x
|
|
#define u_doSpecular u_flags.y
|
|
#define u_doDiffuseIbl u_flags.z
|
|
#define u_doSpecularIbl u_flags.w
|
|
|
|
vec3 fresnel(vec3 _cspec, float _dot)
|
|
{
|
|
return _cspec + (1.0 - _cspec) * pow(1.0 - _dot, 5);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
vec3 light = vec3(0.0, 0.0, -1.0);
|
|
vec3 clight = vec3(1.0, 1.0, 1.0);
|
|
|
|
vec3 v = v_view;
|
|
vec3 n = normalize(v_normal);
|
|
vec3 l = normalize(light);
|
|
vec3 h = normalize(v + l);
|
|
|
|
float ndotl = clamp(dot(n, l), 0.0, 1.0); //diff
|
|
float ndoth = clamp(dot(n, h), 0.0, 1.0); //spec
|
|
float vdoth = clamp(dot(v, h), 0.0, 1.0); //spec fresnel
|
|
float ndotv = clamp(dot(n, v), 0.0, 1.0); //env spec fresnel
|
|
|
|
vec3 r = 2.0*ndotv*n - v; // reflect(v, n);
|
|
|
|
vec3 cubeR = normalize(mul(u_mtx, vec4(r, 0.0)).xyz);
|
|
vec3 cubeN = normalize(mul(u_mtx, vec4(n, 0.0)).xyz);
|
|
|
|
float mipLevel = min((1.0 - u_glossiness)*11.0 + 1.0, 8.0);
|
|
vec3 cenv = textureCubeLod(u_texCube, cubeR, mipLevel).xyz;
|
|
|
|
vec3 kd = u_rgbDiff;
|
|
vec3 ks = u_rgbSpec;
|
|
|
|
vec3 cs = ks * u_diffspec;
|
|
vec3 cd = kd * (1.0 - cs);
|
|
|
|
vec3 diff = cd;
|
|
float pwr = exp2(u_glossiness * 11.0 + 1.0);
|
|
vec3 spec = cs * pow(ndoth, pwr) * ( (pwr + 8.0)/8.0) * fresnel(cs, vdoth);
|
|
|
|
vec3 ambspec = fresnel(cs, ndotv) * cenv;
|
|
vec3 ambdiff = cd * textureCube(u_texCubeIrr, cubeN).xyz;
|
|
|
|
vec3 lc = ( diff * u_doDiffuse + spec * u_doSpecular ) * ndotl * clight;
|
|
vec3 ec = (ambdiff * u_doDiffuseIbl + ambspec * u_doSpecularIbl);
|
|
|
|
vec3 color = lc + ec;
|
|
color = color * exp2(u_exposure);
|
|
|
|
gl_FragColor.xyz = toFilmic(color);
|
|
gl_FragColor.w = 1.0;
|
|
}
|