Initial commit: Minecraft 光追着色器包(从零实现的 path tracing)
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
// MinecraftPT — Final_FS
|
||||
// HDR tonemapping, color grading, dithering, and output to screen.
|
||||
|
||||
#include "/Lib/Settings.glsl"
|
||||
#include "/Lib/Utilities.glsl"
|
||||
#include "/Lib/BasicFunctions/TemporalNoise.glsl"
|
||||
|
||||
uniform sampler2D exposureTex;
|
||||
|
||||
#if defined PROGRAM_FINAL_0
|
||||
layout(location = 0) out vec4 colorOut;
|
||||
#elif defined PROGRAM_FINAL_1
|
||||
layout(location = 0) out vec4 colorOut;
|
||||
#endif
|
||||
|
||||
// Tonemapping operators
|
||||
vec3 TonemapACES(vec3 color){
|
||||
// ACES filmic
|
||||
float a = 2.51;
|
||||
float b = 0.03;
|
||||
float c = 2.43;
|
||||
float d = 0.59;
|
||||
float e = 0.14;
|
||||
return saturate((color * (a * color + b)) / (color * (c * color + d) + e));
|
||||
}
|
||||
|
||||
vec3 TonemapAGX(vec3 color){
|
||||
// AGX-inspired: log-shaping curve
|
||||
vec3 logColor = log2(max(color, 1e-6));
|
||||
vec3 mid = vec3(AGX_HDR_MIDGREY);
|
||||
vec3 shaped = logColor - mid;
|
||||
shaped = tanh(shaped * 0.5) * 0.5 + 0.5;
|
||||
vec3 result = exp2(shaped + mid);
|
||||
return result;
|
||||
}
|
||||
|
||||
vec3 TonemapFilmic(vec3 color){
|
||||
// Uncharted 2 filmic
|
||||
vec3 x = max(color, 0.0);
|
||||
return (x * (6.2 * x + 0.5)) / (x * (6.2 * x + 1.7) + 0.06);
|
||||
}
|
||||
|
||||
// Color grading
|
||||
vec3 ApplyColorGrading(vec3 color){
|
||||
// White/black point
|
||||
color = (color - BLACK_POINT) / (WHITE_POINT - BLACK_POINT + 1e-6);
|
||||
|
||||
// Saturation
|
||||
float lum = luminance(color);
|
||||
color = mix(vec3(lum), color, SATURATION);
|
||||
|
||||
// Gamma
|
||||
color = pow(color, vec3(GAMMA));
|
||||
|
||||
// Hue shifts (simplified)
|
||||
#ifdef ADVANCED_COLOR
|
||||
vec3 midtone = color * MIDTONE_HUE * MIDTONE_STRENGTH;
|
||||
vec3 highlight = color * HIGHLIGHT_HUE * HIGHLIGHT_STRENGTH;
|
||||
vec3 shadow = color * SHADOW_HUE * SHADOW_STRENGTH;
|
||||
color += midtone + highlight + shadow;
|
||||
#endif
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
void main(){
|
||||
vec3 color = texelFetch(colortex12, ivec2(gl_FragCoord.xy), 0).rgb;
|
||||
|
||||
// Exposure
|
||||
#ifdef MANUAL_EXPOSURE
|
||||
float exposure = MANUAL_EXPOSURE * pow(2.0, EV_VALUE);
|
||||
#else
|
||||
float exposure = textureLod(exposureTex, vec2(0.5), 0.0).r;
|
||||
#endif
|
||||
color *= exposure;
|
||||
|
||||
// Bloom composite
|
||||
#ifdef BLOOM
|
||||
vec3 bloom = vec3(0.0);
|
||||
// Simple bloom: sample from bloom buffer
|
||||
bloom = textureLod(colortex15, gl_FragCoord.xy / screenSize, 0.0).rgb;
|
||||
color += bloom * BLOOM_AMOUNT;
|
||||
#endif
|
||||
|
||||
// Tonemapping
|
||||
#if TONEMAP_OPERATOR == 0
|
||||
color = TonemapACES(color);
|
||||
#elif TONEMAP_OPERATOR == 1
|
||||
color = TonemapAGX(color);
|
||||
#elif TONEMAP_OPERATOR == 2
|
||||
color = TonemapFilmic(color);
|
||||
#else
|
||||
// Vanilla-like: Reinhard
|
||||
color = color / (color + 1.0);
|
||||
#endif
|
||||
|
||||
// Color grading
|
||||
color = ApplyColorGrading(color);
|
||||
|
||||
// Dithering
|
||||
vec2 noise = BlueNoiseTemporal2();
|
||||
color += (noise - 0.5) / 255.0;
|
||||
|
||||
// Gamma correction
|
||||
color = LinearToGamma(color);
|
||||
|
||||
colorOut = vec4(color, 1.0);
|
||||
}
|
||||
Reference in New Issue
Block a user