Initial commit: Minecraft 光追着色器包(从零实现的 path tracing)
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
#include "/Lib/Settings.glsl"
|
||||
#include "/Lib/Utilities.glsl"
|
||||
// MinecraftPT — Lighting Constants
|
||||
// Per-frame lighting values computed inline (no SSBO dependency).
|
||||
// These are cheap functions of the sun angle and camera position; computed
|
||||
// per-pass instead of via a shared buffer for maximum loader compatibility.
|
||||
|
||||
#ifndef LIGHTING_CONSTANTS_GLSL
|
||||
#define LIGHTING_CONSTANTS_GLSL
|
||||
|
||||
#include "/Lib/BasicFunctions/PrecomputedAtmosphere.glsl"
|
||||
|
||||
// Sun direction in world space (matches the shadow camera direction)
|
||||
vec3 GetSunDirWorld(){
|
||||
#ifndef DIMENSION_NETHER
|
||||
#ifndef DIMENSION_END
|
||||
return normalize(shadowModelViewInverse2);
|
||||
#else
|
||||
return normalize(shadowModelViewInverse2) * fsign(0.5 - sunAngle);
|
||||
#endif
|
||||
#else
|
||||
return normalize(shadowModelViewInverse2) * fsign(0.5 - sunAngle);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Atmosphere camera position (scaled Earth radius + camera altitude)
|
||||
vec3 GetAtmoCamera(){
|
||||
return vec3(0.0, max(cameraPosition.y, 63.0) * 0.001 + atmosphereModel_bottom_radius, 0.0);
|
||||
}
|
||||
|
||||
// Sun irradiance (direct light color/intensity)
|
||||
vec3 GetSunIrradiance(){
|
||||
vec3 sunDir = GetSunDirWorld();
|
||||
vec3 moon, sunSky, moonSky;
|
||||
return GetSunAndSkyIrradiance(GetAtmoCamera(), sunDir, -sunDir, moon, sunSky, moonSky);
|
||||
}
|
||||
|
||||
vec3 GetMoonIrradiance(){
|
||||
vec3 sunDir = GetSunDirWorld();
|
||||
vec3 moon, sunSky, moonSky;
|
||||
GetSunAndSkyIrradiance(GetAtmoCamera(), sunDir, -sunDir, moon, sunSky, moonSky);
|
||||
return moon;
|
||||
}
|
||||
|
||||
vec3 GetCelestialIrradiance(){
|
||||
return GetSunIrradiance() + GetMoonIrradiance();
|
||||
}
|
||||
|
||||
vec3 GetAtmoIrradiance(){
|
||||
vec3 sunDir = GetSunDirWorld();
|
||||
vec3 moon, sunSky, moonSky;
|
||||
GetSunAndSkyIrradiance(GetAtmoCamera(), sunDir, -sunDir, moon, sunSky, moonSky);
|
||||
return sunSky + moonSky;
|
||||
}
|
||||
|
||||
// Cloud-altitude irradiances
|
||||
vec3 GetCloudSunIrradiance(){
|
||||
vec3 sunDir = GetSunDirWorld();
|
||||
vec3 atmoCamera = vec3(0.0, mix(CLOUD_CLEAR_ALTITUDE, CLOUD_RAIN_ALTITUDE, wetness) * 0.001 + atmosphereModel_bottom_radius, 0.0);
|
||||
vec3 moon, sunSky, moonSky;
|
||||
return GetSunAndSkyIrradiance(atmoCamera, sunDir, -sunDir, moon, sunSky, moonSky);
|
||||
}
|
||||
|
||||
vec3 GetCloudAtmoIrradiance(){
|
||||
vec3 sunDir = GetSunDirWorld();
|
||||
vec3 atmoCamera = vec3(0.0, mix(CLOUD_CLEAR_ALTITUDE, CLOUD_RAIN_ALTITUDE, wetness) * 0.001 + atmosphereModel_bottom_radius, 0.0);
|
||||
vec3 moon, sunSky, moonSky;
|
||||
GetSunAndSkyIrradiance(atmoCamera, sunDir, -sunDir, moon, sunSky, moonSky);
|
||||
return sunSky + moonSky;
|
||||
}
|
||||
|
||||
// Moon/sun phase for fog time factor
|
||||
vec2 GetFogTimeFactor(){
|
||||
vec3 sunDir = GetSunDirWorld();
|
||||
float timeNoon = pow(1.0 - (clamp(sunDir.y, 0.2, 0.99) - 0.2) / 0.8, 6.0);
|
||||
float moonlightStrength = curve(saturate(sunDir.y * -5.0));
|
||||
return vec2(timeNoon, moonlightStrength);
|
||||
}
|
||||
|
||||
// Dimension-aware irradiance override
|
||||
vec3 GetDimensionAmbient(){
|
||||
#ifdef DIMENSION_NETHER
|
||||
return vec3(0.08, 0.02, 0.01) * NETHER_BRIGHTNESS;
|
||||
#elif defined DIMENSION_END
|
||||
return vec3(0.02, 0.02, 0.04);
|
||||
#else
|
||||
return GetAtmoIrradiance();
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user