| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #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
|