mirror of
https://github.com/godotengine/godot.git
synced 2024-11-27 09:16:35 +08:00
Merge pull request #71130 from clayjohn/RD-normal-roughness
Fix multiple issues that make the normal roughness texture unusable
This commit is contained in:
commit
0abd60b953
@ -1668,39 +1668,15 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
||||
using_voxelgi = true;
|
||||
}
|
||||
|
||||
if (p_render_data->environment.is_null() && using_voxelgi) {
|
||||
depth_pass_mode = PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI;
|
||||
} else if (p_render_data->environment.is_valid() && (environment_get_ssr_enabled(p_render_data->environment) || environment_get_sdfgi_enabled(p_render_data->environment) || using_voxelgi)) {
|
||||
if (p_render_data->environment.is_valid()) {
|
||||
if (environment_get_sdfgi_enabled(p_render_data->environment)) {
|
||||
depth_pass_mode = using_voxelgi ? PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI : PASS_MODE_DEPTH_NORMAL_ROUGHNESS; // also voxelgi
|
||||
using_sdfgi = true;
|
||||
} else {
|
||||
depth_pass_mode = using_voxelgi ? PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI : PASS_MODE_DEPTH_NORMAL_ROUGHNESS;
|
||||
}
|
||||
if (environment_get_ssr_enabled(p_render_data->environment)) {
|
||||
using_separate_specular = true;
|
||||
using_ssr = true;
|
||||
color_pass_flags |= COLOR_PASS_FLAG_SEPARATE_SPECULAR;
|
||||
}
|
||||
} else if (p_render_data->environment.is_valid() && (environment_get_ssao_enabled(p_render_data->environment) || using_ssil || get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_NORMAL_BUFFER)) {
|
||||
depth_pass_mode = PASS_MODE_DEPTH_NORMAL_ROUGHNESS;
|
||||
}
|
||||
|
||||
switch (depth_pass_mode) {
|
||||
case PASS_MODE_DEPTH: {
|
||||
depth_framebuffer = rb_data->get_depth_fb();
|
||||
} break;
|
||||
case PASS_MODE_DEPTH_NORMAL_ROUGHNESS: {
|
||||
depth_framebuffer = rb_data->get_depth_fb(RenderBufferDataForwardClustered::DEPTH_FB_ROUGHNESS);
|
||||
depth_pass_clear.push_back(Color(0.5, 0.5, 0.5, 0));
|
||||
} break;
|
||||
case PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI: {
|
||||
depth_framebuffer = rb_data->get_depth_fb(RenderBufferDataForwardClustered::DEPTH_FB_ROUGHNESS_VOXELGI);
|
||||
depth_pass_clear.push_back(Color(0.5, 0.5, 0.5, 0));
|
||||
depth_pass_clear.push_back(Color(0, 0, 0, 0));
|
||||
} break;
|
||||
default: {
|
||||
};
|
||||
}
|
||||
|
||||
if (p_render_data->scene_data->view_count > 1) {
|
||||
@ -1731,6 +1707,38 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
||||
|
||||
RD::get_singleton()->draw_command_end_label();
|
||||
|
||||
if (rb.is_valid()) {
|
||||
if (using_voxelgi) {
|
||||
depth_pass_mode = PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI;
|
||||
} else if (p_render_data->environment.is_valid()) {
|
||||
if (environment_get_ssr_enabled(p_render_data->environment) ||
|
||||
environment_get_sdfgi_enabled(p_render_data->environment) ||
|
||||
environment_get_ssao_enabled(p_render_data->environment) ||
|
||||
using_ssil ||
|
||||
get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_NORMAL_BUFFER ||
|
||||
scene_state.used_normal_texture) {
|
||||
depth_pass_mode = PASS_MODE_DEPTH_NORMAL_ROUGHNESS;
|
||||
}
|
||||
}
|
||||
|
||||
switch (depth_pass_mode) {
|
||||
case PASS_MODE_DEPTH: {
|
||||
depth_framebuffer = rb_data->get_depth_fb();
|
||||
} break;
|
||||
case PASS_MODE_DEPTH_NORMAL_ROUGHNESS: {
|
||||
depth_framebuffer = rb_data->get_depth_fb(RenderBufferDataForwardClustered::DEPTH_FB_ROUGHNESS);
|
||||
depth_pass_clear.push_back(Color(0.5, 0.5, 0.5, 0));
|
||||
} break;
|
||||
case PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI: {
|
||||
depth_framebuffer = rb_data->get_depth_fb(RenderBufferDataForwardClustered::DEPTH_FB_ROUGHNESS_VOXELGI);
|
||||
depth_pass_clear.push_back(Color(0.5, 0.5, 0.5, 0));
|
||||
depth_pass_clear.push_back(Color(0, 0, 0, 0));
|
||||
} break;
|
||||
default: {
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
bool using_sss = rb_data.is_valid() && scene_state.used_sss && ss_effects->sss_get_quality() != RS::SUB_SURFACE_SCATTERING_QUALITY_DISABLED;
|
||||
|
||||
if (using_sss && !using_separate_specular) {
|
||||
@ -1914,7 +1922,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
||||
RID rp_uniform_set = _setup_render_pass_uniform_set(RENDER_LIST_OPAQUE, p_render_data, radiance_texture, true);
|
||||
|
||||
bool can_continue_color = !scene_state.used_screen_texture && !using_ssr && !using_sss;
|
||||
bool can_continue_depth = !scene_state.used_depth_texture && !using_ssr && !using_sss;
|
||||
bool can_continue_depth = !(scene_state.used_depth_texture || scene_state.used_normal_texture) && !using_ssr && !using_sss;
|
||||
|
||||
{
|
||||
bool will_continue_color = (can_continue_color || draw_sky || draw_sky_fog_only || debug_voxelgis || debug_sdfgi_probes);
|
||||
|
@ -121,7 +121,7 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
|
||||
|
||||
actions.usage_flag_pointers["SCREEN_TEXTURE"] = &uses_screen_texture;
|
||||
actions.usage_flag_pointers["DEPTH_TEXTURE"] = &uses_depth_texture;
|
||||
actions.usage_flag_pointers["NORMAL_TEXTURE"] = &uses_normal_texture;
|
||||
actions.usage_flag_pointers["NORMAL_ROUGHNESS_TEXTURE"] = &uses_normal_texture;
|
||||
actions.usage_flag_pointers["DISCARD"] = &uses_discard;
|
||||
actions.usage_flag_pointers["TIME"] = &uses_time;
|
||||
actions.usage_flag_pointers["ROUGHNESS"] = &uses_roughness;
|
||||
|
@ -122,7 +122,7 @@ void SceneShaderForwardMobile::ShaderData::set_code(const String &p_code) {
|
||||
|
||||
actions.usage_flag_pointers["SCREEN_TEXTURE"] = &uses_screen_texture;
|
||||
actions.usage_flag_pointers["DEPTH_TEXTURE"] = &uses_depth_texture;
|
||||
actions.usage_flag_pointers["NORMAL_TEXTURE"] = &uses_normal_texture;
|
||||
actions.usage_flag_pointers["NORMAL_ROUGHNESS_TEXTURE"] = &uses_normal_texture;
|
||||
actions.usage_flag_pointers["DISCARD"] = &uses_discard;
|
||||
actions.usage_flag_pointers["TIME"] = &uses_time;
|
||||
actions.usage_flag_pointers["ROUGHNESS"] = &uses_roughness;
|
||||
|
@ -118,9 +118,15 @@ layout(location = 10) out flat uint instance_index_interp;
|
||||
// !BAS! This needs to become an input once we implement our fallback!
|
||||
#define ViewIndex 0
|
||||
#endif // has_VK_KHR_multiview
|
||||
vec3 normal_roughness_uv(vec2 uv) {
|
||||
return vec3(uv, ViewIndex);
|
||||
}
|
||||
#else // USE_MULTIVIEW
|
||||
// Set to zero, not supported in non stereo
|
||||
#define ViewIndex 0
|
||||
vec2 normal_roughness_uv(vec2 uv) {
|
||||
return uv;
|
||||
}
|
||||
#endif //USE_MULTIVIEW
|
||||
|
||||
invariant gl_Position;
|
||||
@ -544,9 +550,15 @@ layout(location = 10) in flat uint instance_index_interp;
|
||||
// !BAS! This needs to become an input once we implement our fallback!
|
||||
#define ViewIndex 0
|
||||
#endif // has_VK_KHR_multiview
|
||||
vec3 normal_roughness_uv(vec2 uv) {
|
||||
return vec3(uv, ViewIndex);
|
||||
}
|
||||
#else // USE_MULTIVIEW
|
||||
// Set to zero, not supported in non stereo
|
||||
#define ViewIndex 0
|
||||
vec2 normal_roughness_uv(vec2 uv) {
|
||||
return uv;
|
||||
}
|
||||
#endif //USE_MULTIVIEW
|
||||
|
||||
//defines to keep compatibility with vertex
|
||||
|
@ -268,6 +268,7 @@ layout(r32ui, set = 1, binding = 13) uniform restrict uimage3D geom_facing_grid;
|
||||
#define color_buffer shadow_atlas
|
||||
#define normal_roughness_buffer shadow_atlas
|
||||
|
||||
#define multiviewSampler sampler2D
|
||||
#else
|
||||
|
||||
layout(set = 1, binding = 10) uniform texture2D depth_buffer;
|
||||
@ -277,10 +278,12 @@ layout(set = 1, binding = 11) uniform texture2D color_buffer;
|
||||
layout(set = 1, binding = 12) uniform texture2DArray normal_roughness_buffer;
|
||||
layout(set = 1, binding = 14) uniform texture2DArray ambient_buffer;
|
||||
layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer;
|
||||
#define multiviewSampler sampler2DArray
|
||||
#else // USE_MULTIVIEW
|
||||
layout(set = 1, binding = 12) uniform texture2D normal_roughness_buffer;
|
||||
layout(set = 1, binding = 14) uniform texture2D ambient_buffer;
|
||||
layout(set = 1, binding = 15) uniform texture2D reflection_buffer;
|
||||
#define multiviewSampler sampler2D
|
||||
#endif
|
||||
layout(set = 1, binding = 13) uniform texture2D ao_buffer;
|
||||
layout(set = 1, binding = 16) uniform texture2DArray sdfgi_lightprobe_texture;
|
||||
|
@ -1183,6 +1183,10 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
|
||||
|
||||
code += "(";
|
||||
|
||||
// if normal roughness texture is used, we will add logic to automatically switch between
|
||||
// sampler2D and sampler2D array and vec2 UV and vec3 UV.
|
||||
bool normal_roughness_texture_used = false;
|
||||
|
||||
for (int i = 1; i < onode->arguments.size(); i++) {
|
||||
if (i > 1) {
|
||||
code += ", ";
|
||||
@ -1282,11 +1286,24 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
|
||||
}
|
||||
}
|
||||
|
||||
code += ShaderLanguage::get_datatype_name(onode->arguments[i]->get_datatype()) + "(" + node_code + ", " + sampler_name + ")";
|
||||
String data_type_name = "";
|
||||
if (texture_uniform == "NORMAL_ROUGHNESS_TEXTURE") {
|
||||
data_type_name = "multiviewSampler";
|
||||
normal_roughness_texture_used = true;
|
||||
} else {
|
||||
data_type_name = ShaderLanguage::get_datatype_name(onode->arguments[i]->get_datatype());
|
||||
}
|
||||
|
||||
code += data_type_name + "(" + node_code + ", " + sampler_name + ")";
|
||||
} else {
|
||||
code += node_code;
|
||||
}
|
||||
} else {
|
||||
if (normal_roughness_texture_used && i == 2) {
|
||||
// UV coordinate after using normal roughness texture.
|
||||
node_code = "normal_roughness_uv(" + node_code + ".xy)";
|
||||
}
|
||||
|
||||
code += node_code;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user