Initial commit: Minecraft 光追着色器包(从零实现的 path tracing)
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
// MinecraftPT — Water Fragment Shader
|
||||
// Writes the water GBuffer with waves, caustics data
|
||||
|
||||
#include "/Lib/Settings.glsl"
|
||||
#include "/Lib/Utilities.glsl"
|
||||
|
||||
in vec2 texcoord;
|
||||
in vec3 worldPos;
|
||||
in vec3 worldNormal;
|
||||
in vec3 vertexNormal;
|
||||
in vec4 color;
|
||||
in vec2 lightmap;
|
||||
|
||||
layout(location = 0) out vec4 colortex0Out; // albedo + emissive
|
||||
layout(location = 1) out vec4 colortex1Out; // normals
|
||||
layout(location = 2) out vec4 colortex2Out; // spec + matID
|
||||
layout(location = 3) out vec4 colortex3Out; // lightmap
|
||||
layout(location = 4) out vec4 colortex4Out; // translucent albedo + alpha
|
||||
layout(location = 5) out vec4 colortex5Out; // translucent normal + matID
|
||||
|
||||
#include "/Lib/IndividualFunctions/WaterWaves.glsl"
|
||||
|
||||
void main(){
|
||||
vec4 albedo = texture(tex, texcoord) * color;
|
||||
|
||||
// Water surface height / waves
|
||||
vec3 wPos = worldPos;
|
||||
#ifdef WAVE_PARALLAX
|
||||
vec3 waveNormal = GetWaveNormal(wPos, lightmap.y);
|
||||
#else
|
||||
vec3 waveNormal = GetWaveNormal(wPos, lightmap.y);
|
||||
#endif
|
||||
|
||||
// Water color — deep water tint
|
||||
vec3 waterColor = mix(vec3(0.05, 0.15, 0.2), vec3(0.1, 0.3, 0.4), wetness * 0.5);
|
||||
|
||||
// Water lightmap
|
||||
vec2 lm = lightmap;
|
||||
lm.y = SkyLightmapCurve(lightmap.y);
|
||||
|
||||
// Water is translucent
|
||||
colortex0Out = vec4(waterColor, 0.0);
|
||||
colortex1Out = vec4(EncodeNormal(waveNormal), EncodeNormal(vertexNormal));
|
||||
colortex2Out = vec4(0.0, 0.018, 0.0, 1.0 / 255.0); // matID = MATID_WATER
|
||||
colortex3Out = vec4(lm, 1.0, 1.0);
|
||||
|
||||
// Translucent buffer: water albedo is mostly transparent, we store depth tint
|
||||
colortex4Out = vec4(waterColor, 0.6);
|
||||
colortex5Out = vec4(EncodeNormal(waveNormal), 1.0 / 255.0, 0.0);
|
||||
}
|
||||
Reference in New Issue
Block a user