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;
|
using_voxelgi = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_render_data->environment.is_null() && using_voxelgi) {
|
if (p_render_data->environment.is_valid()) {
|
||||||
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 (environment_get_sdfgi_enabled(p_render_data->environment)) {
|
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;
|
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)) {
|
if (environment_get_ssr_enabled(p_render_data->environment)) {
|
||||||
using_separate_specular = true;
|
using_separate_specular = true;
|
||||||
using_ssr = true;
|
using_ssr = true;
|
||||||
color_pass_flags |= COLOR_PASS_FLAG_SEPARATE_SPECULAR;
|
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) {
|
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();
|
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;
|
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) {
|
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);
|
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_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);
|
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["SCREEN_TEXTURE"] = &uses_screen_texture;
|
||||||
actions.usage_flag_pointers["DEPTH_TEXTURE"] = &uses_depth_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["DISCARD"] = &uses_discard;
|
||||||
actions.usage_flag_pointers["TIME"] = &uses_time;
|
actions.usage_flag_pointers["TIME"] = &uses_time;
|
||||||
actions.usage_flag_pointers["ROUGHNESS"] = &uses_roughness;
|
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["SCREEN_TEXTURE"] = &uses_screen_texture;
|
||||||
actions.usage_flag_pointers["DEPTH_TEXTURE"] = &uses_depth_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["DISCARD"] = &uses_discard;
|
||||||
actions.usage_flag_pointers["TIME"] = &uses_time;
|
actions.usage_flag_pointers["TIME"] = &uses_time;
|
||||||
actions.usage_flag_pointers["ROUGHNESS"] = &uses_roughness;
|
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!
|
// !BAS! This needs to become an input once we implement our fallback!
|
||||||
#define ViewIndex 0
|
#define ViewIndex 0
|
||||||
#endif // has_VK_KHR_multiview
|
#endif // has_VK_KHR_multiview
|
||||||
|
vec3 normal_roughness_uv(vec2 uv) {
|
||||||
|
return vec3(uv, ViewIndex);
|
||||||
|
}
|
||||||
#else // USE_MULTIVIEW
|
#else // USE_MULTIVIEW
|
||||||
// Set to zero, not supported in non stereo
|
// Set to zero, not supported in non stereo
|
||||||
#define ViewIndex 0
|
#define ViewIndex 0
|
||||||
|
vec2 normal_roughness_uv(vec2 uv) {
|
||||||
|
return uv;
|
||||||
|
}
|
||||||
#endif //USE_MULTIVIEW
|
#endif //USE_MULTIVIEW
|
||||||
|
|
||||||
invariant gl_Position;
|
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!
|
// !BAS! This needs to become an input once we implement our fallback!
|
||||||
#define ViewIndex 0
|
#define ViewIndex 0
|
||||||
#endif // has_VK_KHR_multiview
|
#endif // has_VK_KHR_multiview
|
||||||
|
vec3 normal_roughness_uv(vec2 uv) {
|
||||||
|
return vec3(uv, ViewIndex);
|
||||||
|
}
|
||||||
#else // USE_MULTIVIEW
|
#else // USE_MULTIVIEW
|
||||||
// Set to zero, not supported in non stereo
|
// Set to zero, not supported in non stereo
|
||||||
#define ViewIndex 0
|
#define ViewIndex 0
|
||||||
|
vec2 normal_roughness_uv(vec2 uv) {
|
||||||
|
return uv;
|
||||||
|
}
|
||||||
#endif //USE_MULTIVIEW
|
#endif //USE_MULTIVIEW
|
||||||
|
|
||||||
//defines to keep compatibility with vertex
|
//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 color_buffer shadow_atlas
|
||||||
#define normal_roughness_buffer shadow_atlas
|
#define normal_roughness_buffer shadow_atlas
|
||||||
|
|
||||||
|
#define multiviewSampler sampler2D
|
||||||
#else
|
#else
|
||||||
|
|
||||||
layout(set = 1, binding = 10) uniform texture2D depth_buffer;
|
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 = 12) uniform texture2DArray normal_roughness_buffer;
|
||||||
layout(set = 1, binding = 14) uniform texture2DArray ambient_buffer;
|
layout(set = 1, binding = 14) uniform texture2DArray ambient_buffer;
|
||||||
layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer;
|
layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer;
|
||||||
|
#define multiviewSampler sampler2DArray
|
||||||
#else // USE_MULTIVIEW
|
#else // USE_MULTIVIEW
|
||||||
layout(set = 1, binding = 12) uniform texture2D normal_roughness_buffer;
|
layout(set = 1, binding = 12) uniform texture2D normal_roughness_buffer;
|
||||||
layout(set = 1, binding = 14) uniform texture2D ambient_buffer;
|
layout(set = 1, binding = 14) uniform texture2D ambient_buffer;
|
||||||
layout(set = 1, binding = 15) uniform texture2D reflection_buffer;
|
layout(set = 1, binding = 15) uniform texture2D reflection_buffer;
|
||||||
|
#define multiviewSampler sampler2D
|
||||||
#endif
|
#endif
|
||||||
layout(set = 1, binding = 13) uniform texture2D ao_buffer;
|
layout(set = 1, binding = 13) uniform texture2D ao_buffer;
|
||||||
layout(set = 1, binding = 16) uniform texture2DArray sdfgi_lightprobe_texture;
|
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 += "(";
|
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++) {
|
for (int i = 1; i < onode->arguments.size(); i++) {
|
||||||
if (i > 1) {
|
if (i > 1) {
|
||||||
code += ", ";
|
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 {
|
} else {
|
||||||
code += node_code;
|
code += node_code;
|
||||||
}
|
}
|
||||||
} else {
|
} 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;
|
code += node_code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user