mirror of
https://github.com/X0nk/Bliss-Shader.git
synced 2025-06-20 16:07:22 +08:00

FIXED AND IMPROVED translucent rendering. FIXED random stuff from rendering over the hand. FIXED hand shading. FIXED blue horses. FIXED translucent lighting on the hand. FIXED translucent lighting on entities. IMPROVED colored shadows. IMPROVED SSAO application to the scene. IMPROVED subsurface scattering and give it more settings. IMPROVED bloom. ADD AgX tonemap and make it default.
395 lines
12 KiB
GLSL
395 lines
12 KiB
GLSL
#include "/lib/settings.glsl"
|
|
|
|
#define ReflectedFog
|
|
|
|
#define USE_WEATHER_PARAMS
|
|
|
|
#ifdef Daily_Weather
|
|
flat varying vec4 dailyWeatherParams0;
|
|
flat varying vec4 dailyWeatherParams1;
|
|
#endif
|
|
|
|
flat varying vec3 averageSkyCol_Clouds;
|
|
flat varying vec3 averageSkyCol;
|
|
|
|
flat varying vec3 lightSourceColor;
|
|
flat varying vec3 sunColor;
|
|
flat varying vec3 moonColor;
|
|
// flat varying vec3 zenithColor;
|
|
// flat varying vec3 rayleighAborbance;
|
|
|
|
// flat varying vec3 WsunVec;
|
|
|
|
flat varying vec2 tempOffsets;
|
|
|
|
flat varying float exposure;
|
|
flat varying float avgBrightness;
|
|
flat varying float rodExposure;
|
|
flat varying float avgL2;
|
|
flat varying float centerDepth;
|
|
|
|
uniform sampler2D noisetex;
|
|
|
|
uniform float frameTime;
|
|
uniform int frameCounter;
|
|
uniform float frameTimeCounter;
|
|
uniform float rainStrength;
|
|
uniform float eyeAltitude;
|
|
uniform vec3 sunVec;
|
|
uniform vec2 texelSize;
|
|
uniform mat4 gbufferProjection;
|
|
uniform mat4 gbufferProjectionInverse;
|
|
uniform mat4 gbufferPreviousProjection;
|
|
uniform mat4 gbufferModelViewInverse;
|
|
uniform mat4 gbufferModelView;
|
|
uniform mat4 shadowModelView;
|
|
uniform mat4 shadowProjection;
|
|
uniform float sunElevation;
|
|
uniform vec3 sunPosition;
|
|
uniform vec3 cameraPosition;
|
|
// uniform float far;
|
|
uniform ivec2 eyeBrightnessSmooth;
|
|
|
|
|
|
vec4 lightCol = vec4(lightSourceColor, float(sunElevation > 1e-5)*2-1.);
|
|
|
|
#include "/lib/util.glsl"
|
|
#include "/lib/ROBOBO_sky.glsl"
|
|
#include "/lib/sky_gradient.glsl"
|
|
#include "/lib/Shadow_Params.glsl"
|
|
|
|
vec3 WsunVec = mat3(gbufferModelViewInverse)*sunVec;
|
|
// vec3 WsunVec = normalize(LightDir);
|
|
|
|
vec3 toShadowSpaceProjected(vec3 p3){
|
|
p3 = mat3(gbufferModelViewInverse) * p3 + gbufferModelViewInverse[3].xyz;
|
|
p3 = mat3(shadowModelView) * p3 + shadowModelView[3].xyz;
|
|
p3 = diagonal3(shadowProjection) * p3 + shadowProjection[3].xyz;
|
|
|
|
return p3;
|
|
}
|
|
float interleaved_gradientNoise(){
|
|
vec2 coord = gl_FragCoord.xy;
|
|
float noise = fract(52.9829189*fract(0.06711056*coord.x + 0.00583715*coord.y)+frameCounter/1.6180339887);
|
|
return noise;
|
|
}
|
|
float blueNoise(){
|
|
return fract(texelFetch2D(noisetex, ivec2(gl_FragCoord.xy)%512, 0).a + 1.0/1.6180339887 * frameCounter);
|
|
}
|
|
|
|
#define DHVLFOG
|
|
// #define diagonal3(m) vec3((m)[0].x, (m)[1].y, m[2].z)
|
|
// #define projMAD(m, v) (diagonal3(m) * (v) + (m)[3].xyz)
|
|
|
|
vec3 toScreenSpace(vec3 p) {
|
|
vec4 iProjDiag = vec4(gbufferProjectionInverse[0].x, gbufferProjectionInverse[1].y, gbufferProjectionInverse[2].zw);
|
|
vec3 feetPlayerPos = p * 2. - 1.;
|
|
vec4 viewPos = iProjDiag * feetPlayerPos.xyzz + gbufferProjectionInverse[3];
|
|
return viewPos.xyz / viewPos.w;
|
|
}
|
|
|
|
uniform float dhFarPlane;
|
|
uniform float dhNearPlane;
|
|
|
|
#include "/lib/DistantHorizons_projections.glsl"
|
|
|
|
vec3 DH_toScreenSpace(vec3 p) {
|
|
vec4 iProjDiag = vec4(dhProjectionInverse[0].x, dhProjectionInverse[1].y, dhProjectionInverse[2].zw);
|
|
vec3 feetPlayerPos = p * 2. - 1.;
|
|
vec4 viewPos = iProjDiag * feetPlayerPos.xyzz + dhProjectionInverse[3];
|
|
return viewPos.xyz / viewPos.w;
|
|
}
|
|
|
|
vec3 DH_toClipSpace3(vec3 viewSpacePosition) {
|
|
return projMAD(dhProjection, viewSpacePosition) / -viewSpacePosition.z * 0.5 + 0.5;
|
|
}
|
|
|
|
// float DH_ld(float dist) {
|
|
// return (2.0 * dhNearPlane) / (dhFarPlane + dhNearPlane - dist * (dhFarPlane - dhNearPlane));
|
|
// }
|
|
// float DH_invLinZ (float lindepth){
|
|
// return -((2.0*dhNearPlane/lindepth)-dhFarPlane-dhNearPlane)/(dhFarPlane-dhNearPlane);
|
|
// }
|
|
|
|
float DH_ld(float dist) {
|
|
return (2.0 * dhNearPlane) / (dhFarPlane + dhNearPlane - dist * (dhFarPlane - dhNearPlane));
|
|
}
|
|
float DH_inv_ld (float lindepth){
|
|
return -((2.0*dhNearPlane/lindepth)-dhFarPlane-dhNearPlane)/(dhFarPlane-dhNearPlane);
|
|
}
|
|
|
|
float linearizeDepthFast(const in float depth, const in float near, const in float far) {
|
|
return (near * far) / (depth * (near - far) + far);
|
|
}
|
|
|
|
#ifdef OVERWORLD_SHADER
|
|
|
|
// uniform sampler2D colortex12;
|
|
// const bool shadowHardwareFiltering = true;
|
|
uniform sampler2DShadow shadow;
|
|
|
|
// #undef TRANSLUCENT_COLORED_SHADOWS
|
|
|
|
#ifdef TRANSLUCENT_COLORED_SHADOWS
|
|
uniform sampler2D shadowcolor0;
|
|
uniform sampler2DShadow shadowtex0;
|
|
uniform sampler2DShadow shadowtex1;
|
|
#endif
|
|
|
|
#define TEST
|
|
#define TIMEOFDAYFOG
|
|
#include "/lib/lightning_stuff.glsl"
|
|
#include "/lib/volumetricClouds.glsl"
|
|
#include "/lib/overworld_fog.glsl"
|
|
|
|
#endif
|
|
#ifdef NETHER_SHADER
|
|
uniform sampler2D colortex4;
|
|
#include "/lib/nether_fog.glsl"
|
|
#endif
|
|
#ifdef END_SHADER
|
|
uniform sampler2D colortex4;
|
|
#include "/lib/end_fog.glsl"
|
|
#endif
|
|
vec3 rodSample(vec2 Xi)
|
|
{
|
|
float r = sqrt(1.0f - Xi.x*Xi.y);
|
|
float phi = 2 * 3.14159265359 * Xi.y;
|
|
|
|
return normalize(vec3(cos(phi) * r, sin(phi) * r, Xi.x)).xzy;
|
|
}
|
|
//Low discrepancy 2D sequence, integration error is as low as sobol but easier to compute : http://extremelearning.com.au/unreasonable-effectiveness-of-quasirandom-sequences/
|
|
vec2 R2_samples(float n){
|
|
vec2 alpha = vec2(0.75487765, 0.56984026);
|
|
return fract(alpha * n);
|
|
}
|
|
|
|
void main() {
|
|
/* DRAWBUFFERS:4 */
|
|
|
|
gl_FragData[0] = vec4(0.0);
|
|
float mixhistory = 0.06;
|
|
|
|
float accumuteSpeed = texelFetch2D(colortex4, ivec2(5,5), 0).r/150.0;
|
|
|
|
vec2 pixelPos6 = vec2(5,5);
|
|
|
|
if (gl_FragCoord.x > pixelPos6.x && gl_FragCoord.x < pixelPos6.x + 1 && gl_FragCoord.y > pixelPos6.y && gl_FragCoord.y < pixelPos6.y + 1){
|
|
mixhistory = 0.1;
|
|
gl_FragData[0] = vec4(1,0,0,1);
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef OVERWORLD_SHADER
|
|
|
|
//////////////////////////////////////////////
|
|
/// --- STORE DAILY WEATHER PARAMETERS --- ///
|
|
//////////////////////////////////////////////
|
|
|
|
// the idea is to store the 8 values, coverage + density of 3 cloud layers and 2 fog density values.
|
|
|
|
#ifdef Daily_Weather
|
|
ivec2 pixelPos = ivec2(0,0);
|
|
if (gl_FragCoord.x > 1 && gl_FragCoord.x < 3 && gl_FragCoord.y > 1 && gl_FragCoord.y < 2){
|
|
|
|
mixhistory = 0.01;
|
|
|
|
if(gl_FragCoord.x < 2) gl_FragData[0] = dailyWeatherParams0;
|
|
if(gl_FragCoord.x > 2) gl_FragData[0] = dailyWeatherParams1;
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////
|
|
/// --- STORE COLOR LUT --- ///
|
|
///////////////////////////////
|
|
|
|
vec3 AmbientLightTint = vec3(AmbientLight_R, AmbientLight_G, AmbientLight_B);
|
|
|
|
// --- the color of the atmosphere + the average color of the atmosphere.
|
|
vec3 skyGroundCol = skyFromTex(vec3(0, -1 ,0), colortex4).rgb;// * clamp(WsunVec.y*2.0,0.2,1.0);
|
|
|
|
|
|
|
|
/// --- Save light values
|
|
if (gl_FragCoord.x < 1. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(averageSkyCol_Clouds * AmbientLightTint,1.0);
|
|
|
|
if (gl_FragCoord.x > 1. && gl_FragCoord.x < 2. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4((skyGroundCol/150.0) * AmbientLightTint,1.0);
|
|
|
|
#ifdef ambientLight_only
|
|
if (gl_FragCoord.x > 6. && gl_FragCoord.x < 7. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(0.0,0.0,0.0,1.0);
|
|
|
|
if (gl_FragCoord.x > 8. && gl_FragCoord.x < 9. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(0.0,0.0,0.0,1.0);
|
|
|
|
if (gl_FragCoord.x > 13. && gl_FragCoord.x < 14. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(0.0,0.0,0.0,1.0);
|
|
#else
|
|
if (gl_FragCoord.x > 6. && gl_FragCoord.x < 7. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(lightSourceColor,1.0);
|
|
|
|
if (gl_FragCoord.x > 8. && gl_FragCoord.x < 9. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(sunColor,1.0);
|
|
if (gl_FragCoord.x > 9. && gl_FragCoord.x < 10. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(moonColor,1.0);
|
|
// if (gl_FragCoord.x > 16. && gl_FragCoord.x < 17. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
// gl_FragData[0] = vec4(rayleighAborbance,1.0);
|
|
#endif
|
|
|
|
|
|
////////////////////////////////
|
|
/// --- ATMOSPHERE IMAGE --- ///
|
|
////////////////////////////////
|
|
|
|
/// --- Sky only
|
|
if (gl_FragCoord.x > 18. && gl_FragCoord.y > 1. && gl_FragCoord.x < 18+257){
|
|
|
|
|
|
vec2 p = clamp(floor(gl_FragCoord.xy-vec2(18.,1.))/256.+tempOffsets/256.,0.0,1.0);
|
|
vec3 viewVector = cartToSphere(p);
|
|
|
|
vec2 planetSphere = vec2(0.0);
|
|
vec3 sky = vec3(0.0);
|
|
vec3 skyAbsorb = vec3(0.0);
|
|
|
|
// float GroundDarkening = (exp2(-15 * clamp(-viewVector.y,0.0,1.0)) * 0.7+0.3); // darken the ground in the sky.
|
|
sky = calculateAtmosphere((averageSkyCol*4000./2.0) , viewVector, vec3(0.0,1.0,0.0), WsunVec, -WsunVec, planetSphere, skyAbsorb, 10, blueNoise());
|
|
|
|
// sky = mix(sky, (averageSkyCol + skyAbsorb)*4000./2.0, (1.0 - exp(pow(clamp(-viewVector.y+0.5,0.0,1.0),2) * -25)));
|
|
|
|
// fade atmosphere conditions for rain away when you pass above the cloud plane.
|
|
float heightRelativeToClouds = clamp(1.0 - max(eyeAltitude - CloudLayer0_height,0.0) / 200.0 ,0.0,1.0);
|
|
if(rainStrength > 0.0) sky = mix(sky, 3.0 + averageSkyCol*4000 * (skyAbsorb*0.7+0.3), clamp(1.0 - exp(pow(clamp(-viewVector.y+0.9,0.0,1.0),2) * -5.0),0.0,1.0) * heightRelativeToClouds * rainStrength);
|
|
|
|
#ifdef AEROCHROME_MODE
|
|
sky *= vec3(0.0, 0.18, 0.35);
|
|
#endif
|
|
|
|
gl_FragData[0] = vec4(sky / 4000.0 * Sky_Brightness, 1.0);
|
|
}
|
|
|
|
/// --- Sky + clouds + fog
|
|
if (gl_FragCoord.x > 18.+257. && gl_FragCoord.y > 1. && gl_FragCoord.x < 18+257+257.){
|
|
vec2 p = clamp(floor(gl_FragCoord.xy-vec2(18.+257,1.))/256.+tempOffsets/256.,0.0,1.0);
|
|
vec3 viewVector = cartToSphere(p);
|
|
|
|
WsunVec = normalize(mat3(gbufferModelViewInverse) * sunPosition) * ( float(sunElevation > 1e-5)*2.0-1.0 );
|
|
|
|
vec3 sky = texelFetch2D(colortex4,ivec2(gl_FragCoord.xy)-ivec2(257,0),0).rgb/150.0;
|
|
|
|
vec3 suncol = lightSourceColor;
|
|
|
|
#ifdef ambientLight_only
|
|
suncol = vec3(0.0);
|
|
#endif
|
|
|
|
vec4 clouds = renderClouds(mat3(gbufferModelView)*viewVector*1024., vec2(fract(frameCounter/1.6180339887),1-fract(frameCounter/1.6180339887)), suncol*2.0, skyGroundCol/30.0);
|
|
sky = sky*clouds.a + clouds.rgb / 5.0;
|
|
|
|
sky = mix(dot(sky,vec3(0.333)) * vec3(0.5), sky, pow(clamp(viewVector.y+1.0,0.0,1.0),5));
|
|
vec4 VL_Fog = GetVolumetricFog(mat3(gbufferModelView)*viewVector*1024., vec2(fract(frameCounter/1.6180339887),1-fract(frameCounter/1.6180339887)), suncol*1.75, skyGroundCol/30.0);
|
|
|
|
sky = sky * VL_Fog.a + VL_Fog.rgb / 5.0;
|
|
|
|
|
|
// if(p.y < 0.05) sky = averageSkyCol_Clouds;
|
|
|
|
gl_FragData[0] = vec4(sky,1.0);
|
|
}
|
|
#endif
|
|
|
|
#if defined NETHER_SHADER || defined END_SHADER
|
|
vec2 fogPos = vec2(256.0 - 256.0*0.12,1.0);
|
|
|
|
//Sky gradient with clouds
|
|
if (gl_FragCoord.x > (fogPos.x - fogPos.x*0.22) && gl_FragCoord.y > 0.4 && gl_FragCoord.x < 535){
|
|
vec2 p = clamp(floor(gl_FragCoord.xy-fogPos)/256.+tempOffsets/256.,-0.2,1.2);
|
|
vec3 viewVector = cartToSphere(p);
|
|
|
|
vec3 BackgroundColor = vec3(0.0);
|
|
|
|
vec4 VL_Fog = GetVolumetricFog(mat3(gbufferModelView)*viewVector*256., fract(frameCounter/1.6180339887), fract(frameCounter/2.6180339887));
|
|
|
|
BackgroundColor += VL_Fog.rgb/5.0;
|
|
|
|
gl_FragData[0] = vec4(BackgroundColor, 1.0);
|
|
|
|
}
|
|
#endif
|
|
|
|
#ifdef END_SHADER
|
|
/* ---------------------- TIMER ---------------------- */
|
|
|
|
float flash = 0.0;
|
|
float maxWaitTime = 5;
|
|
|
|
float Timer = texelFetch2D(colortex4, ivec2(3,1), 0).x/150.0;
|
|
Timer -= frameTime;
|
|
|
|
if(Timer <= 0.0){
|
|
flash = 1.0;
|
|
|
|
Timer = pow(hash11(frameCounter), 5) * maxWaitTime;
|
|
}
|
|
|
|
vec2 pixelPos0 = vec2(3,1);
|
|
if (gl_FragCoord.x > pixelPos0.x && gl_FragCoord.x < pixelPos0.x + 1 && gl_FragCoord.y > pixelPos0.y && gl_FragCoord.y < pixelPos0.y + 1){
|
|
mixhistory = 1.0;
|
|
gl_FragData[0] = vec4(Timer, 0.0, 0.0, 1.0);
|
|
}
|
|
|
|
/* ---------------------- FLASHING ---------------------- */
|
|
|
|
vec2 pixelPos1 = vec2(1,1);
|
|
if (gl_FragCoord.x > pixelPos1.x && gl_FragCoord.x < pixelPos1.x + 1 && gl_FragCoord.y > pixelPos1.y && gl_FragCoord.y < pixelPos1.y + 1){
|
|
mixhistory = clamp(4.0 * frameTime,0.0,1.0);
|
|
gl_FragData[0] = vec4(flash, 0.0, 0.0, 1.0);
|
|
}
|
|
|
|
/* ---------------------- POSITION ---------------------- */
|
|
|
|
vec2 pixelPos2 = vec2(2,1);
|
|
if (gl_FragCoord.x > pixelPos2.x && gl_FragCoord.x < pixelPos2.x + 1 && gl_FragCoord.y > pixelPos2.y && gl_FragCoord.y < pixelPos2.y + 1){
|
|
mixhistory = clamp(500.0 * frameTime,0.0,1.0);
|
|
|
|
vec3 LastPos = (texelFetch2D(colortex4,ivec2(2,1),0).xyz/150.0) * 2.0 - 1.0;
|
|
|
|
LastPos += (hash31(frameCounter / 50) * 2.0 - 1.0);
|
|
LastPos = LastPos * 0.5 + 0.5;
|
|
|
|
if(Timer > maxWaitTime * 0.7 ){
|
|
LastPos = vec3(0.0);
|
|
}
|
|
|
|
gl_FragData[0] = vec4(LastPos, 1.0);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
//Temporally accumulate sky and light values
|
|
vec3 temp = texelFetch2D(colortex4,ivec2(gl_FragCoord.xy),0).rgb;
|
|
vec3 curr = gl_FragData[0].rgb*150.;
|
|
|
|
if(accumuteSpeed < 1.0) mixhistory = 1.0;
|
|
|
|
gl_FragData[0].rgb = clamp(mix(temp, curr, mixhistory),0.0,65000.);
|
|
|
|
|
|
//Exposure values
|
|
if (gl_FragCoord.x > 10. && gl_FragCoord.x < 11. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(exposure, avgBrightness, avgL2,1.0);
|
|
if (gl_FragCoord.x > 14. && gl_FragCoord.x < 15. && gl_FragCoord.y > 19.+18. && gl_FragCoord.y < 19.+18.+1 )
|
|
gl_FragData[0] = vec4(rodExposure, centerDepth,0.0, 1.0);
|
|
} |