Files
armorpaint/Shaders/std/light.glsl
T
luboslenco 5dc7af5ef1 Cleanup
2020-08-18 20:52:28 +02:00

62 lines
1.5 KiB
GLSL

#ifndef _LIGHT_GLSL_
#define _LIGHT_GLSL_
#include "../std/brdf.glsl"
#include "../std/math.glsl"
#ifdef _VoxelAOvar
#include "../std/conetrace.glsl"
#endif
#include "../std/ltc.glsl"
uniform vec3 lightArea0;
uniform vec3 lightArea1;
uniform vec3 lightArea2;
uniform vec3 lightArea3;
uniform sampler2D sltcMat;
uniform sampler2D sltcMag;
vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, const vec3 lp, const vec3 lightCol,
const vec3 albedo, const float rough, const vec3 f0
#ifdef _VoxelAOvar
#ifdef _VoxelShadow
, sampler3D voxels, vec3 voxpos
#endif
#endif
, float occ
) {
vec3 ld = lp - p;
vec3 l = normalize(ld);
vec3 h = normalize(v + l);
float dotNH = dot(n, h);
float dotVH = dot(v, h);
float dotNL = dot(n, l);
float theta = acos(dotNV);
vec2 tuv = vec2(rough, theta / (0.5 * PI));
tuv = tuv * LUT_SCALE + LUT_BIAS;
vec4 t = textureLod(sltcMat, tuv, 0.0);
mat3 invM = mat3(
vec3(1.0, 0.0, t.y),
vec3(0.0, t.z, 0.0),
vec3(t.w, 0.0, t.x));
float ltcspec = ltcEvaluate(n, v, dotNV, p, invM, lightArea0, lightArea1, lightArea2, lightArea3);
ltcspec *= textureLod(sltcMag, tuv, 0.0).a;
float ltcdiff = ltcEvaluate(n, v, dotNV, p, mat3(1.0), lightArea0, lightArea1, lightArea2, lightArea3);
vec3 direct = albedo * ltcdiff + ltcspec * 0.05;
direct *= attenuate(distance(p, lp));
direct *= lightCol;
direct *= dotNL + 2.0 * occ * occ - 1.0;
#ifdef _VoxelAOvar
#ifdef _VoxelShadow
direct *= 1.0 - traceShadow(voxels, voxpos, l);
#endif
#endif
return direct;
}
#endif