mirror of
https://github.com/godotengine/godot.git
synced 2025-02-18 16:50:48 +00:00
Merge pull request #65594 from clayjohn/SSR-dialectric
This commit is contained in:
commit
f211869530
@ -1484,7 +1484,7 @@ void SSEffects::ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const Rend
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const Color &p_metallic_mask, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets) {
|
void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets) {
|
||||||
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
|
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
|
||||||
ERR_FAIL_NULL(uniform_set_cache);
|
ERR_FAIL_NULL(uniform_set_cache);
|
||||||
MaterialStorage *material_storage = MaterialStorage::get_singleton();
|
MaterialStorage *material_storage = MaterialStorage::get_singleton();
|
||||||
@ -1579,10 +1579,6 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R
|
|||||||
push_constant.proj_info[1] = -2.0f / (p_screen_size.height * p_projections[v].matrix[1][1]);
|
push_constant.proj_info[1] = -2.0f / (p_screen_size.height * p_projections[v].matrix[1][1]);
|
||||||
push_constant.proj_info[2] = (1.0f - p_projections[v].matrix[0][2]) / p_projections[v].matrix[0][0];
|
push_constant.proj_info[2] = (1.0f - p_projections[v].matrix[0][2]) / p_projections[v].matrix[0][0];
|
||||||
push_constant.proj_info[3] = (1.0f + p_projections[v].matrix[1][2]) / p_projections[v].matrix[1][1];
|
push_constant.proj_info[3] = (1.0f + p_projections[v].matrix[1][2]) / p_projections[v].matrix[1][1];
|
||||||
push_constant.metallic_mask[0] = CLAMP(p_metallic_mask.r * 255.0, 0, 255);
|
|
||||||
push_constant.metallic_mask[1] = CLAMP(p_metallic_mask.g * 255.0, 0, 255);
|
|
||||||
push_constant.metallic_mask[2] = CLAMP(p_metallic_mask.b * 255.0, 0, 255);
|
|
||||||
push_constant.metallic_mask[3] = CLAMP(p_metallic_mask.a * 255.0, 0, 255);
|
|
||||||
|
|
||||||
ScreenSpaceReflectionMode mode = (p_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) ? SCREEN_SPACE_REFLECTION_ROUGH : SCREEN_SPACE_REFLECTION_NORMAL;
|
ScreenSpaceReflectionMode mode = (p_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) ? SCREEN_SPACE_REFLECTION_ROUGH : SCREEN_SPACE_REFLECTION_NORMAL;
|
||||||
RID shader = ssr.shader.version_get_shader(ssr.shader_version, mode);
|
RID shader = ssr.shader.version_get_shader(ssr.shader_version, mode);
|
||||||
|
@ -168,7 +168,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
void ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const Size2i &p_screen_size, const uint32_t p_view_count);
|
void ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, const Size2i &p_screen_size, const uint32_t p_view_count);
|
||||||
void screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RS::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const Color &p_metallic_mask, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets);
|
void screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, RS::EnvironmentSSRRoughnessQuality p_roughness_quality, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets);
|
||||||
void ssr_free(SSRRenderBuffers &p_ssr_buffers);
|
void ssr_free(SSRRenderBuffers &p_ssr_buffers);
|
||||||
|
|
||||||
/* subsurface scattering */
|
/* subsurface scattering */
|
||||||
@ -465,10 +465,7 @@ private:
|
|||||||
uint32_t orthogonal; // 4 - 52
|
uint32_t orthogonal; // 4 - 52
|
||||||
float filter_mipmap_levels; // 4 - 56
|
float filter_mipmap_levels; // 4 - 56
|
||||||
uint32_t use_half_res; // 4 - 60
|
uint32_t use_half_res; // 4 - 60
|
||||||
uint8_t metallic_mask[4]; // 4 - 64
|
uint32_t view_index; // 4 - 64
|
||||||
|
|
||||||
uint32_t view_index; // 4 - 68
|
|
||||||
uint32_t pad[3]; // 12 - 80
|
|
||||||
|
|
||||||
// float projection[16]; // this is in our ScreenSpaceReflectionSceneData now
|
// float projection[16]; // this is in our ScreenSpaceReflectionSceneData now
|
||||||
};
|
};
|
||||||
|
@ -1609,7 +1609,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||||||
for (uint32_t v = 0; v < p_render_data->view_count; v++) {
|
for (uint32_t v = 0; v < p_render_data->view_count; v++) {
|
||||||
specular_views[v] = rb_data->get_specular(v);
|
specular_views[v] = rb_data->get_specular(v);
|
||||||
}
|
}
|
||||||
_process_ssr(rb, color_only_framebuffer, normal_roughness_views, rb_data->get_specular(), specular_views, Color(0, 0, 0, 1), p_render_data->environment, p_render_data->view_projection, p_render_data->view_eye_offset, rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED);
|
_process_ssr(rb, color_only_framebuffer, normal_roughness_views, rb_data->get_specular(), specular_views, p_render_data->environment, p_render_data->view_projection, p_render_data->view_eye_offset, rb->get_msaa_3d() == RS::VIEWPORT_MSAA_DISABLED);
|
||||||
RD::get_singleton()->draw_command_end_label();
|
RD::get_singleton()->draw_command_end_label();
|
||||||
} else {
|
} else {
|
||||||
//just mix specular back
|
//just mix specular back
|
||||||
|
@ -1328,7 +1328,7 @@ void RendererSceneRenderRD::_process_sss(Ref<RenderSceneBuffersRD> p_render_buff
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RendererSceneRenderRD::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_slices, RID p_specular_buffer, const RID *p_metallic_slices, const Color &p_metallic_mask, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive) {
|
void RendererSceneRenderRD::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_slices, RID p_specular_buffer, const RID *p_metallic_slices, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive) {
|
||||||
ERR_FAIL_NULL(ss_effects);
|
ERR_FAIL_NULL(ss_effects);
|
||||||
ERR_FAIL_COND(p_render_buffers.is_null());
|
ERR_FAIL_COND(p_render_buffers.is_null());
|
||||||
|
|
||||||
@ -1355,7 +1355,7 @@ void RendererSceneRenderRD::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buff
|
|||||||
texture_slices[v] = p_render_buffers->get_internal_texture(v);
|
texture_slices[v] = p_render_buffers->get_internal_texture(v);
|
||||||
depth_slices[v] = p_render_buffers->get_depth_texture(v);
|
depth_slices[v] = p_render_buffers->get_depth_texture(v);
|
||||||
}
|
}
|
||||||
ss_effects->screen_space_reflection(p_render_buffers->ssr, texture_slices, p_normal_slices, ssr_roughness_quality, p_metallic_slices, p_metallic_mask, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), view_count, p_projections, p_eye_offsets);
|
ss_effects->screen_space_reflection(p_render_buffers->ssr, texture_slices, p_normal_slices, ssr_roughness_quality, p_metallic_slices, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), view_count, p_projections, p_eye_offsets);
|
||||||
copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), p_render_buffers->ssr.output, view_count);
|
copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), p_render_buffers->ssr.output, view_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,7 +138,7 @@ protected:
|
|||||||
virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) = 0;
|
virtual RID _render_buffers_get_velocity_texture(Ref<RenderSceneBuffersRD> p_render_buffers) = 0;
|
||||||
|
|
||||||
void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection);
|
void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection);
|
||||||
void _process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_buffer_slices, RID p_specular_buffer, const RID *p_metallic_slices, const Color &p_metallic_mask, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive);
|
void _process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_buffer_slices, RID p_specular_buffer, const RID *p_metallic_slices, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive);
|
||||||
void _process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera);
|
void _process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera);
|
||||||
void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform);
|
void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform);
|
||||||
|
|
||||||
|
@ -30,12 +30,7 @@ layout(push_constant, std430) uniform Params {
|
|||||||
bool orthogonal;
|
bool orthogonal;
|
||||||
float filter_mipmap_levels;
|
float filter_mipmap_levels;
|
||||||
bool use_half_res;
|
bool use_half_res;
|
||||||
uint metallic_mask;
|
|
||||||
|
|
||||||
uint view_index;
|
uint view_index;
|
||||||
uint pad1;
|
|
||||||
uint pad2;
|
|
||||||
uint pad3;
|
|
||||||
}
|
}
|
||||||
params;
|
params;
|
||||||
|
|
||||||
@ -167,7 +162,7 @@ void main() {
|
|||||||
|
|
||||||
if (depth > z_to) {
|
if (depth > z_to) {
|
||||||
// if depth was surpassed
|
// if depth was surpassed
|
||||||
if (depth <= max(z_to, z_from) + params.depth_tolerance && -depth < params.camera_z_far) {
|
if (depth <= max(z_to, z_from) + params.depth_tolerance && -depth < params.camera_z_far * 0.95) {
|
||||||
// check the depth tolerance and far clip
|
// check the depth tolerance and far clip
|
||||||
// check that normal is valid
|
// check that normal is valid
|
||||||
found = true;
|
found = true;
|
||||||
@ -231,18 +226,20 @@ void main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Isn't this going to be overwritten after our endif?
|
|
||||||
final_color = imageLoad(source_diffuse, ivec2((final_pos - 0.5) * pixel_size));
|
|
||||||
|
|
||||||
imageStore(blur_radius_image, ssC, vec4(blur_radius / 255.0)); //stored in r8
|
imageStore(blur_radius_image, ssC, vec4(blur_radius / 255.0)); //stored in r8
|
||||||
|
|
||||||
#endif // MODE_ROUGH
|
#endif // MODE_ROUGH
|
||||||
|
|
||||||
final_color = vec4(imageLoad(source_diffuse, ivec2(final_pos - 0.5)).rgb, fade * margin_blend);
|
final_color = vec4(imageLoad(source_diffuse, ivec2(final_pos - 0.5)).rgb, fade * margin_blend);
|
||||||
|
|
||||||
//change blend by metallic
|
// Schlick term.
|
||||||
vec4 metallic_mask = unpackUnorm4x8(params.metallic_mask);
|
float metallic = texelFetch(source_metallic, ssC << 1, 0).w;
|
||||||
final_color.a *= dot(metallic_mask, texelFetch(source_metallic, ssC << 1, 0));
|
float f0 = mix(0.04, 1.0, metallic); // Assume a "specular" amount of 0.5
|
||||||
|
normal.y = -normal.y;
|
||||||
|
float m = clamp(1.0 - dot(normalize(normal), -view_dir), 0.0, 1.0);
|
||||||
|
float m2 = m * m;
|
||||||
|
m = m2 * m2 * m; // pow(m,5)
|
||||||
|
final_color.a *= f0 + (1.0 - f0) * m; // Fresnel Schlick term.
|
||||||
|
|
||||||
imageStore(ssr_image, ssC, final_color);
|
imageStore(ssr_image, ssC, final_color);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user