You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-11 13:10:58 +00:00
Overhaul screen space reflections.
This commit is contained in:
@@ -1597,6 +1597,12 @@ void fragment_shader(in SceneData scene_data) {
|
||||
float kernelRoughness2 = min(2.0 * variance, scene_data.roughness_limiter_limit); //limit effect
|
||||
float filteredRoughness2 = min(1.0, roughness2 + kernelRoughness2);
|
||||
roughness = sqrt(filteredRoughness2);
|
||||
|
||||
// Reject very small roughness values. Lack of precision can collapse
|
||||
// roughness^4 to 0 in GGX specular equations and cause divisions by zero.
|
||||
if (roughness < 0.00000001) {
|
||||
roughness = 0.0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
//apply energy conservation
|
||||
@@ -2029,6 +2035,39 @@ void fragment_shader(in SceneData scene_data) {
|
||||
#endif
|
||||
}
|
||||
|
||||
//process ssr
|
||||
if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSR)) {
|
||||
bool resolve_ssr = bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_RESOLVE_SSR);
|
||||
|
||||
float ssr_mip_level = 0.0;
|
||||
if (resolve_ssr) {
|
||||
#ifdef USE_MULTIVIEW
|
||||
ssr_mip_level = textureLod(sampler2DArray(ssr_mip_level_buffer, SAMPLER_NEAREST_CLAMP), vec3(screen_uv, ViewIndex), 0.0).x;
|
||||
#else
|
||||
ssr_mip_level = textureLod(sampler2D(ssr_mip_level_buffer, SAMPLER_NEAREST_CLAMP), screen_uv, 0.0).x;
|
||||
#endif // USE_MULTIVIEW
|
||||
|
||||
ssr_mip_level *= 14.0;
|
||||
}
|
||||
|
||||
#ifdef USE_MULTIVIEW
|
||||
vec4 ssr = textureLod(sampler2DArray(ssr_buffer, SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), vec3(screen_uv, ViewIndex), ssr_mip_level);
|
||||
#else
|
||||
vec4 ssr = textureLod(sampler2D(ssr_buffer, SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP), screen_uv, ssr_mip_level);
|
||||
#endif // USE_MULTIVIEW
|
||||
|
||||
if (resolve_ssr) {
|
||||
const vec3 rec709_luminance_weights = vec3(0.2126, 0.7152, 0.0722);
|
||||
ssr.rgb /= 1.0 - dot(ssr.rgb, rec709_luminance_weights);
|
||||
}
|
||||
|
||||
// Apply fade when approaching 0.7 roughness to smoothen the harsh cutoff in the main SSR trace pass.
|
||||
ssr *= smoothstep(0.0, 1.0, 1.0 - clamp((roughness - 0.6) / (0.7 - 0.6), 0.0, 1.0));
|
||||
|
||||
// Alpha is premultiplied.
|
||||
indirect_specular_light = indirect_specular_light * (1.0 - ssr.a) + ssr.rgb;
|
||||
}
|
||||
|
||||
//finalize ambient light here
|
||||
{
|
||||
ambient_light *= ao;
|
||||
|
||||
@@ -164,8 +164,10 @@ layout(set = 0, binding = 2) uniform sampler shadow_sampler;
|
||||
//3 bits of stride
|
||||
#define INSTANCE_FLAGS_PARTICLE_TRAIL_MASK 0xFF
|
||||
|
||||
#define SCREEN_SPACE_EFFECTS_FLAGS_USE_SSAO 1
|
||||
#define SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL 2
|
||||
#define SCREEN_SPACE_EFFECTS_FLAGS_USE_SSAO (1 << 0)
|
||||
#define SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL (1 << 1)
|
||||
#define SCREEN_SPACE_EFFECTS_FLAGS_USE_SSR (1 << 2)
|
||||
#define SCREEN_SPACE_EFFECTS_FLAGS_RESOLVE_SSR (1 << 3)
|
||||
|
||||
layout(set = 0, binding = 3, std430) restrict readonly buffer OmniLights {
|
||||
LightData data[];
|
||||
@@ -435,8 +437,12 @@ layout(set = 1, binding = 33) uniform texture3D volumetric_fog_texture;
|
||||
|
||||
#ifdef USE_MULTIVIEW
|
||||
layout(set = 1, binding = 34) uniform texture2DArray ssil_buffer;
|
||||
layout(set = 1, binding = 35) uniform texture2DArray ssr_buffer;
|
||||
layout(set = 1, binding = 36) uniform texture2DArray ssr_mip_level_buffer;
|
||||
#else
|
||||
layout(set = 1, binding = 34) uniform texture2D ssil_buffer;
|
||||
layout(set = 1, binding = 35) uniform texture2D ssr_buffer;
|
||||
layout(set = 1, binding = 36) uniform texture2D ssr_mip_level_buffer;
|
||||
#endif // USE_MULTIVIEW
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user