forked from LeenkxTeam/LNXSDK
Converted rendering engine to reverse-z
This commit is contained in:
@ -21,10 +21,18 @@ uniform float envmapStrength;
|
||||
#include "std/shirr.glsl"
|
||||
#endif
|
||||
#include "std/environment_sample.glsl"
|
||||
#include "std/light.glsl"
|
||||
|
||||
uniform sampler2D gbufferD;
|
||||
uniform sampler2D gbuffer0;
|
||||
uniform sampler2D gbuffer1;
|
||||
// Gbuffer
|
||||
//uniform sampler2D depthtex; // Raw depth
|
||||
uniform sampler2D gbufferD; // Depth (cheap)
|
||||
uniform sampler2D gbuffer0; // Normal/Metal
|
||||
uniform sampler2D gbuffer1; // Albedo
|
||||
|
||||
uniform vec2 cameraProj;
|
||||
uniform vec3 eye;
|
||||
uniform vec3 eyeLook;
|
||||
uniform mat4 invVP;
|
||||
|
||||
#ifdef _gbuffer2
|
||||
uniform sampler2D gbuffer2;
|
||||
@ -65,11 +73,6 @@ uniform sampler2D ssaotex;
|
||||
uniform vec2 lightPlane;
|
||||
#endif
|
||||
|
||||
#ifdef _SSRS
|
||||
//!uniform mat4 VP;
|
||||
uniform mat4 invVP;
|
||||
#endif
|
||||
|
||||
#ifdef _LightIES
|
||||
//!uniform sampler2D texIES;
|
||||
#endif
|
||||
@ -99,10 +102,6 @@ uniform mat4 invVP;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
uniform vec2 cameraProj;
|
||||
uniform vec3 eye;
|
||||
uniform vec3 eyeLook;
|
||||
|
||||
#ifdef _Clusters
|
||||
uniform vec4 lightsArray[maxLights * 3];
|
||||
#ifdef _Spot
|
||||
@ -204,6 +203,7 @@ in vec3 viewRay;
|
||||
out vec4 fragColor;
|
||||
|
||||
void main() {
|
||||
fragColor = vec4(0.0);
|
||||
vec4 g0 = textureLod(gbuffer0, texCoord, 0.0); // Normal.xy, roughness, metallic/matid
|
||||
|
||||
vec3 n;
|
||||
@ -218,14 +218,22 @@ void main() {
|
||||
|
||||
vec4 g1 = textureLod(gbuffer1, texCoord, 0.0); // Basecolor.rgb, spec/occ
|
||||
vec2 occspec = unpackFloat2(g1.a);
|
||||
vec3 albedo = surfaceAlbedo(g1.rgb, metallic); // g1.rgb - basecolor
|
||||
vec3 albedo = surfaceAlbedo(g1.rgb, metallic); // g1.rgb - basecolor
|
||||
vec3 f0 = surfaceF0(g1.rgb, metallic);
|
||||
vec3 envl = vec3(0.0);
|
||||
|
||||
float depth = textureLod(gbufferD, texCoord, 0.0).r * 2.0 - 1.0;
|
||||
vec3 p = getPos(eye, eyeLook, normalize(viewRay), depth, cameraProj);
|
||||
vec3 v = normalize(eye - p);
|
||||
float dotNV = max(dot(n, v), 0.0);
|
||||
// world-space position:
|
||||
float rawDepth = textureLod(gbufferD, texCoord, 0.0).r;
|
||||
float clipZ = rawDepth * 2.0 - 1.0; // depth -> clip-space
|
||||
vec4 clipPos = vec4(texCoord * 2.0 - 1.0, clipZ, 1.0);
|
||||
vec4 worldPos = invVP * clipPos;
|
||||
vec3 p = worldPos.xyz / worldPos.w;
|
||||
vec3 v = normalize(eye - p);
|
||||
float dotNV = max(dot(n, v), 0.0);
|
||||
|
||||
// view-space vector for reflection
|
||||
vec3 viewPos = getPosView(viewRay, rawDepth, cameraProj);
|
||||
vec3 viewDir = normalize(-viewPos);
|
||||
|
||||
#ifdef _gbuffer2
|
||||
vec4 g2 = textureLod(gbuffer2, texCoord, 0.0);
|
||||
@ -252,12 +260,6 @@ void main() {
|
||||
fragColor.rgb += ambient * ambientIntensity;
|
||||
#endif
|
||||
|
||||
#ifndef _SSR
|
||||
// Only apply specular environment lighting if SSR is NOT active
|
||||
vec3 envSpecular = sampleSpecularEnvironment(reflect(viewDir, normal), roughness);
|
||||
finalColor.rgb += envSpecular * environmentIntensity;
|
||||
#endif
|
||||
|
||||
#ifdef _Rad
|
||||
vec3 reflectionWorld = reflect(-v, n);
|
||||
float lod = getMipFromRoughness(roughness, envmapNumMipmaps);
|
||||
@ -298,28 +300,37 @@ void main() {
|
||||
envl.rgb *= textureLod(voxels_ao, texCoord, 0.0).r;
|
||||
#endif
|
||||
|
||||
// if voxel GI isn't enabled, we fall back to SSR (SSR also processes indirect)
|
||||
#ifndef _VoxelGI
|
||||
fragColor.rgb = envl;
|
||||
fragColor.rgb += envl;
|
||||
#ifndef _SSR
|
||||
// if SSR is disabled, we fallback to simple environment texture
|
||||
vec3 fallbackEnvColor = sampleSpecularEnvironment(reflect(viewDir, n), roughness);
|
||||
fragColor.rgb += fallbackEnvColor;
|
||||
#endif
|
||||
#endif
|
||||
// Show voxels
|
||||
// vec3 origin = vec3(texCoord * 2.0 - 1.0, 0.99);
|
||||
// vec3 direction = vec3(0.0, 0.0, -1.0);
|
||||
// vec4 color = vec4(0.0f);
|
||||
// for(uint step = 0; step < 400 && color.a < 0.99f; ++step) {
|
||||
// vec3 point = origin + 0.005 * step * direction;
|
||||
// color += (1.0f - color.a) * textureLod(voxels, point * 0.5 + 0.5, 0);
|
||||
// }
|
||||
// fragColor.rgb += color.rgb;
|
||||
|
||||
// Show SSAO
|
||||
// fragColor.rgb = texture(ssaotex, texCoord).rrr;
|
||||
// show voxel GI
|
||||
#ifdef _VoxelGI
|
||||
// Show voxels
|
||||
vec3 origin = vec3(texCoord * 2.0 - 1.0, 0.99);
|
||||
vec3 direction = vec3(0.0, 0.0, -1.0);
|
||||
vec4 color = vec4(0.0f);
|
||||
for(uint step = 0; step < 400 && color.a < 0.99f; ++step) {
|
||||
vec3 point = origin + 0.005 * step * direction;
|
||||
color += (1.0f - color.a) * textureLod(voxels, point * 0.5 + 0.5, 0);
|
||||
}
|
||||
fragColor.rgb += color.rgb;
|
||||
#endif
|
||||
|
||||
// show SSAO
|
||||
#ifdef _SSAO
|
||||
// #ifdef _RTGI
|
||||
// fragColor.rgb *= textureLod(ssaotex, texCoord, 0.0).rgb;
|
||||
// #else
|
||||
fragColor.rgb *= textureLod(ssaotex, texCoord, 0.0).r;
|
||||
// #endif
|
||||
fragColor.rgb = texture(ssaotex, texCoord).rrr;
|
||||
// #ifdef _RTGI
|
||||
// fragColor.rgb *= textureLod(ssaotex, texCoord, 0.0).rgb;
|
||||
// #else
|
||||
fragColor.rgb *= textureLod(ssaotex, texCoord, 0.0).r;
|
||||
// #endif
|
||||
#endif
|
||||
|
||||
#ifdef _EmissionShadeless
|
||||
@ -467,7 +478,8 @@ void main() {
|
||||
#endif
|
||||
|
||||
#ifdef _Clusters
|
||||
float viewz = linearize(depth * 0.5 + 0.5, cameraProj);
|
||||
// compute linear depth for clustering directly from the reconstructed view-space pos:
|
||||
float viewz = length(viewPos);
|
||||
int clusterI = getClusterI(texCoord, viewz, cameraPlane);
|
||||
int numLights = int(texelFetch(clustersData, ivec2(clusterI, 0), 0).r * 255);
|
||||
|
||||
@ -511,6 +523,7 @@ void main() {
|
||||
#ifdef _MicroShadowing
|
||||
, occspec.x
|
||||
#endif
|
||||
// TODO: Cleanup. Probably broken
|
||||
#ifdef _SSRS
|
||||
, gbufferD, invVP, eye
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user