84 lines
2.5 KiB
GLSL
84 lines
2.5 KiB
GLSL
#version 450
|
|
|
|
// layout (local_size_x = 4, local_size_y = 4, local_size_z = 4) in;
|
|
layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
|
|
|
|
#include "compiled.inc"
|
|
#include "std/math.glsl"
|
|
#include "std/gbuffer.glsl"
|
|
#include "std/shadows.glsl"
|
|
#include "std/imageatomic.glsl"
|
|
|
|
uniform vec3 lightPos;
|
|
uniform vec3 lightColor;
|
|
uniform int lightType;
|
|
uniform vec3 lightDir;
|
|
uniform vec2 spotData;
|
|
#ifdef _ShadowMap
|
|
uniform int lightShadow;
|
|
uniform vec2 lightProj;
|
|
uniform float shadowsBias;
|
|
uniform mat4 LVP;
|
|
#endif
|
|
|
|
uniform layout(binding = 0, r32ui) readonly uimage3D voxelsOpac;
|
|
// uniform layout(binding = 1, r32ui) readonly uimage3D voxelsNor;
|
|
uniform layout(binding = 1, r32ui) uimage3D voxels;
|
|
#ifdef _ShadowMap
|
|
uniform layout(binding = 2) sampler2DShadow shadowMap;
|
|
uniform layout(binding = 3) sampler2DShadow shadowMapSpot;
|
|
uniform layout(binding = 4) samplerCubeShadow shadowMapPoint;
|
|
#endif
|
|
|
|
void main() {
|
|
|
|
uint ucol = imageLoad(voxelsOpac, ivec3(gl_GlobalInvocationID.xyz)).r;
|
|
vec4 col = convRGBA8ToVec4(ucol);
|
|
if (col.a == 0.0) return;
|
|
|
|
const vec3 hres = voxelgiResolution / 2;
|
|
vec3 wposition = ((gl_GlobalInvocationID.xyz - hres) / hres) * voxelgiHalfExtents;
|
|
|
|
// uint unor = imageLoad(voxelsNor, ivec3(gl_GlobalInvocationID.xyz)).r;
|
|
// vec3 wnormal = normalize(decNor(unor));
|
|
|
|
// wposition -= wnormal * 0.01; // Offset
|
|
|
|
float visibility;
|
|
vec3 lp = lightPos - wposition;
|
|
vec3 l;
|
|
if (lightType == 0) { l = lightDir; visibility = 1.0; }
|
|
else { l = normalize(lp); visibility = attenuate(distance(wposition, lightPos)); }
|
|
|
|
// float dotNL = max(dot(wnormal, l), 0.0);
|
|
// if (dotNL == 0.0) return;
|
|
|
|
#ifdef _ShadowMap
|
|
if (lightShadow == 1) {
|
|
vec4 lightPosition = LVP * vec4(wposition, 1.0);
|
|
vec3 lPos = lightPosition.xyz / lightPosition.w;
|
|
visibility = texture(shadowMap, vec3(lPos.xy, lPos.z - shadowsBias)).r;
|
|
}
|
|
else if (lightShadow == 2) {
|
|
vec4 lightPosition = LVP * vec4(wposition, 1.0);
|
|
vec3 lPos = lightPosition.xyz / lightPosition.w;
|
|
visibility *= texture(shadowMapSpot, vec3(lPos.xy, lPos.z - shadowsBias)).r;
|
|
}
|
|
else if (lightShadow == 3) {
|
|
visibility *= texture(shadowMapPoint, vec4(-l, lpToDepth(lp, lightProj) - shadowsBias)).r;
|
|
}
|
|
#endif
|
|
|
|
if (lightType == 2) {
|
|
float spotEffect = dot(lightDir, l);
|
|
if (spotEffect < spotData.x) {
|
|
visibility *= smoothstep(spotData.y, spotData.x, spotEffect);
|
|
}
|
|
}
|
|
|
|
col.rgb *= visibility * lightColor;// * dotNL;
|
|
col = clamp(col, vec4(0.0), vec4(1.0));
|
|
|
|
imageAtomicAdd(voxels, ivec3(gl_GlobalInvocationID.xyz), convVec4ToRGBA8(col));
|
|
}
|