Initial commit: Minecraft 光追着色器包(从零实现的 path tracing)
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
// MinecraftPT — Translucent_FS
|
||||
// Composites translucent geometry (water, glass, particles) on top of solid.
|
||||
|
||||
#include "/Lib/Settings.glsl"
|
||||
#include "/Lib/Utilities.glsl"
|
||||
#include "/Lib/BasicFunctions/LightingConstants.glsl"
|
||||
#include "/Lib/GbufferData.glsl"
|
||||
#include "/Lib/BasicFunctions/Sunlight_Shadow.glsl"
|
||||
#include "/Lib/BasicFunctions/Blocklight.glsl"
|
||||
#include "/Lib/PathTracing/Tracer/SampleIRC.glsl"
|
||||
#include "/Lib/PathTracing/Tracer/ShadowTracing.glsl"
|
||||
|
||||
uniform sampler2D colortex12; // combined HDR solid scene
|
||||
uniform sampler2D colortex4; // translucent albedo
|
||||
uniform sampler2D colortex5; // translucent normal
|
||||
|
||||
layout(location = 0) out vec4 colorOut;
|
||||
|
||||
void main(){
|
||||
ivec2 texelCoord = ivec2(gl_FragCoord.xy);
|
||||
|
||||
float depth = texelFetch(depthtex0, texelCoord, 0).r;
|
||||
if (depth >= 1.0){
|
||||
colorOut = texelFetch(colortex12, texelCoord, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if there is translucent data
|
||||
vec4 gbuffer5 = texelFetch(colortex5, texelCoord, 0);
|
||||
float matID = gbuffer5.a * 255.0;
|
||||
|
||||
if (matID < 0.5){
|
||||
colorOut = texelFetch(colortex12, texelCoord, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
bool isSmooth;
|
||||
GbufferData gbuffer = GetGbufferDataTranslucent(texelCoord, isSmooth);
|
||||
|
||||
vec4 viewPos = gbufferProjectionInverse * vec4(vec2(texelCoord) / screenSize * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);
|
||||
viewPos.xyz /= viewPos.w;
|
||||
vec3 worldPos = gbufferModelViewInverse[3].xyz + viewPos.xyz;
|
||||
|
||||
vec3 solidColor = texelFetch(colortex12, texelCoord, 0).rgb;
|
||||
|
||||
// Water: blend with refraction
|
||||
vec3 color = solidColor;
|
||||
|
||||
if (matID == MATID_WATER){
|
||||
vec3 waterColor = gbuffer.albedo;
|
||||
float alpha = gbuffer.albedoAlpha;
|
||||
|
||||
// Fresnel
|
||||
vec3 viewDir = normalize(-viewPos.xyz);
|
||||
float NdotV = max(dot(gbuffer.worldNormal, viewDir), 0.0);
|
||||
float fresnel = 0.02 + 0.98 * pow(1.0 - NdotV, 5.0);
|
||||
|
||||
// Light contribution (sun + sky) on water
|
||||
vec3 sunLight = GetSunlight(viewPos.xyz, worldPos, gbuffer.vertexNormal, gbuffer.worldNormal, gbuffer.lightmap.x);
|
||||
vec3 waterLight = waterColor * (sunLight + Blocklight(gbuffer.lightmap) * 0.5);
|
||||
|
||||
// Water tint / depth color
|
||||
vec3 deepColor = waterColor * 0.3;
|
||||
|
||||
color = mix(solidColor, waterLight + deepColor, fresnel * 0.8 + 0.2);
|
||||
|
||||
}else if (matID == MATID_STAINEDGLASS){
|
||||
vec3 glassColor = gbuffer.albedo;
|
||||
float alpha = gbuffer.albedoAlpha;
|
||||
|
||||
vec3 viewDir = normalize(-viewPos.xyz);
|
||||
float NdotV = max(dot(gbuffer.worldNormal, viewDir), 0.0);
|
||||
float fresnel = 0.04 + 0.96 * pow(1.0 - NdotV, 5.0);
|
||||
|
||||
color = mix(solidColor, solidColor * glassColor, fresnel);
|
||||
color += glassColor * 0.1;
|
||||
|
||||
}else{
|
||||
// Particles etc — additively blend
|
||||
color = solidColor + gbuffer.albedo * gbuffer.albedoAlpha * 0.5;
|
||||
}
|
||||
|
||||
colorOut = vec4(color, 1.0);
|
||||
}
|
||||
Reference in New Issue
Block a user