forked from LeenkxTeam/LNXSDK
Patch_2
This commit is contained in:
@ -1,7 +1,6 @@
|
||||
//
|
||||
// Copyright (C) 2012 Jorge Jimenez (jorge@iryoku.com)
|
||||
// Copyright (C) 2012 Diego Gutierrez (diegog@unizar.es)
|
||||
// Copyright (C) 2025 Onek8 (info@leenkx.com)
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
@ -34,17 +33,10 @@
|
||||
// policies, either expressed or implied, of the copyright holders.
|
||||
//
|
||||
|
||||
// TODO:
|
||||
// Add real sss radius
|
||||
// Add real sss scale
|
||||
// Move temp hash, reorganize shader utility functions
|
||||
// Add compiler flag for quality presets or with samples parameter
|
||||
// Clean up + Document comment
|
||||
|
||||
|
||||
#version 450
|
||||
|
||||
#include "compiled.inc"
|
||||
#include "std/gbuffer.glsl"
|
||||
|
||||
uniform sampler2D gbufferD;
|
||||
uniform sampler2D gbuffer0;
|
||||
@ -56,7 +48,8 @@ uniform vec2 cameraProj;
|
||||
in vec2 texCoord;
|
||||
out vec4 fragColor;
|
||||
|
||||
const float SSSS_FOVY = 108.0;
|
||||
const vec3 SKIN_SSS_RADIUS = vec3(4.8, 2.4, 1.5);
|
||||
const float SSS_DISTANCE_SCALE = 0.001;
|
||||
|
||||
// Temp hash func -
|
||||
float hash13(vec3 p3) {
|
||||
@ -69,63 +62,54 @@ vec4 SSSSBlur() {
|
||||
const int SSSS_N_SAMPLES = 15;
|
||||
vec4 kernel[SSSS_N_SAMPLES];
|
||||
|
||||
// color neutral kernel weights to prevent color shifting
|
||||
kernel[0] = vec4(0.2, 0.2, 0.2, 0.0);
|
||||
kernel[1] = vec4(0.12, 0.12, 0.12, 0.2);
|
||||
kernel[2] = vec4(0.09, 0.09, 0.09, 0.4);
|
||||
kernel[3] = vec4(0.06, 0.06, 0.06, 0.8);
|
||||
kernel[4] = vec4(0.04, 0.04, 0.04, 1.2);
|
||||
kernel[5] = vec4(0.025, 0.025, 0.025, 1.6);
|
||||
kernel[6] = vec4(0.015, 0.015, 0.015, 2.0);
|
||||
kernel[7] = vec4(0.005, 0.005, 0.005, 2.5);
|
||||
kernel[8] = vec4(0.12, 0.12, 0.12, -0.2);
|
||||
kernel[9] = vec4(0.09, 0.09, 0.09, -0.4);
|
||||
kernel[10] = vec4(0.06, 0.06, 0.06, -0.8);
|
||||
kernel[11] = vec4(0.04, 0.04, 0.04, -1.2);
|
||||
kernel[12] = vec4(0.025, 0.025, 0.025, -1.6);
|
||||
kernel[13] = vec4(0.015, 0.015, 0.015, -2.0);
|
||||
kernel[14] = vec4(0.005, 0.005, 0.005, -2.5);
|
||||
kernel[0] = vec4(0.233, 0.455, 0.649, 0.0); // Center sample
|
||||
kernel[1] = vec4(0.100, 0.336, 0.344, 0.37); // +0.37mm
|
||||
kernel[2] = vec4(0.118, 0.198, 0.0, 0.97); // +0.97mm
|
||||
kernel[3] = vec4(0.113, 0.007, 0.007, 1.93); // +1.93mm
|
||||
kernel[4] = vec4(0.358, 0.004, 0.0, 3.87); // +3.87mm
|
||||
kernel[5] = vec4(0.078, 0.0, 0.0, 6.53); // +6.53mm (red only)
|
||||
kernel[6] = vec4(0.0, 0.0, 0.0, 0.0); // Unused
|
||||
kernel[7] = vec4(0.0, 0.0, 0.0, 0.0); // Unused
|
||||
kernel[8] = vec4(0.100, 0.336, 0.344, -0.37); // -0.37mm
|
||||
kernel[9] = vec4(0.118, 0.198, 0.0, -0.97); // -0.97mm
|
||||
kernel[10] = vec4(0.113, 0.007, 0.007, -1.93); // -1.93mm
|
||||
kernel[11] = vec4(0.358, 0.004, 0.0, -3.87); // -3.87mm
|
||||
kernel[12] = vec4(0.078, 0.0, 0.0, -6.53); // -6.53mm (red only)
|
||||
kernel[13] = vec4(0.0, 0.0, 0.0, 0.0); // Unused
|
||||
kernel[14] = vec4(0.0, 0.0, 0.0, 0.0); // Unused
|
||||
|
||||
vec4 colorM = textureLod(tex, texCoord, 0.0);
|
||||
|
||||
float depth = textureLod(gbufferD, texCoord, 0.0).r;
|
||||
float depthM = cameraProj.y / (depth - cameraProj.x);
|
||||
|
||||
float distanceToProjectionWindow = 1.0 / tan(0.5 * radians(SSSS_FOVY));
|
||||
float scale = distanceToProjectionWindow / depthM;
|
||||
|
||||
vec2 finalStep = sssWidth * scale * dir;
|
||||
float distanceScale = 1.0 / max(depthM, 0.1);
|
||||
|
||||
vec2 finalStep = sssWidth * distanceScale * dir * SSS_DISTANCE_SCALE;
|
||||
|
||||
|
||||
vec3 jitterSeed = vec3(texCoord.xy * 1000.0, fract(cameraProj.x * 0.0001));
|
||||
float jitterOffset = (hash13(jitterSeed) * 2.0 - 1.0) * 0.15; // 15% jitteR
|
||||
float jitterOffset = (hash13(jitterSeed) * 2.0 - 1.0) * 0.15;
|
||||
|
||||
finalStep *= (1.0 + jitterOffset);
|
||||
finalStep *= 0.05;
|
||||
vec3 colorBlurred = vec3(0.0);
|
||||
vec3 weightSum = vec3(0.0);
|
||||
colorBlurred += colorM.rgb * kernel[0].rgb;
|
||||
weightSum += kernel[0].rgb;
|
||||
|
||||
// Accumulate the other samples with per-pixel jittering to reduce banding
|
||||
for (int i = 1; i < SSSS_N_SAMPLES; i++) {
|
||||
float sampleJitter = hash13(vec3(texCoord.xy * 720.0, float(i) * 37.45)) * 0.1 - 0.05;
|
||||
|
||||
vec2 offset = texCoord + (kernel[i].a + sampleJitter) * finalStep;
|
||||
vec4 color = textureLod(tex, offset, 0.0);
|
||||
const float DEPTH_THRESHOLD = 0.05;
|
||||
float sampleDepth = textureLod(gbufferD, offset, 0.0).r;
|
||||
float sampleDepthM = cameraProj.y / (sampleDepth - cameraProj.x);
|
||||
|
||||
// ADJUST FOR SURFACE FOLLOWING
|
||||
// 0.0 = disabled (maximum SSS but with bleeding), 1.0 = fully enabled (prevents bleeding but might reduce SSS effect)
|
||||
const float SURFACE_FOLLOWING_STRENGTH = 0.15; // Reduced to preserve more SSS effect
|
||||
float depthDiff = abs(depthM - sampleDepthM);
|
||||
float depthWeight = exp(-depthDiff * 10.0);
|
||||
|
||||
if (SURFACE_FOLLOWING_STRENGTH > 0.0) {
|
||||
float sampleDepth = textureLod(gbufferD, offset, 0.0).r;
|
||||
float depthScale = 5.0;
|
||||
float depthDiff = abs(depth - sampleDepth) * depthScale;
|
||||
if (depthDiff > 0.3) {
|
||||
float blendFactor = clamp(depthDiff - 0.3, 0.0, 1.0) * SURFACE_FOLLOWING_STRENGTH;
|
||||
color.rgb = mix(color.rgb, colorM.rgb, blendFactor);
|
||||
}
|
||||
if (depthDiff > DEPTH_THRESHOLD) {
|
||||
color.rgb = mix(colorM.rgb, color.rgb, depthWeight);
|
||||
}
|
||||
|
||||
colorBlurred += color.rgb * kernel[i].rgb;
|
||||
@ -133,17 +117,22 @@ vec4 SSSSBlur() {
|
||||
}
|
||||
vec3 normalizedColor = colorBlurred / max(weightSum, vec3(0.00001));
|
||||
float dither = hash13(vec3(texCoord * 1333.0, 0.0)) * 0.003 - 0.0015;
|
||||
return vec4(normalizedColor + vec3(dither), colorM.a);
|
||||
normalizedColor = max(normalizedColor + vec3(dither), vec3(0.0));
|
||||
return vec4(normalizedColor, colorM.a);
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec4 g0 = textureLod(gbuffer0, texCoord, 0.0);
|
||||
float metallic;
|
||||
uint matid;
|
||||
unpackFloatInt16(g0.a, metallic, matid);
|
||||
|
||||
if (textureLod(gbuffer0, texCoord, 0.0).a == 8192.0) {
|
||||
if (matid == 2u) {
|
||||
vec4 originalColor = textureLod(tex, texCoord, 0.0);
|
||||
vec4 blurredColor = SSSSBlur();
|
||||
vec4 finalColor = mix(blurredColor, originalColor, 0.15);
|
||||
|
||||
fragColor = clamp(finalColor, 0.0, 1.0);
|
||||
vec4 sssContribution = blurredColor - originalColor;
|
||||
vec4 combined = originalColor + max(vec4(0.0), sssContribution) * 0.8;
|
||||
fragColor = max(vec4(0.0), min(combined, vec4(10.0)));
|
||||
} else {
|
||||
fragColor = textureLod(tex, texCoord, 0.0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user