diff options
Diffstat (limited to 'servers/rendering/renderer_rd/shaders')
12 files changed, 119 insertions, 94 deletions
diff --git a/servers/rendering/renderer_rd/shaders/canvas.glsl b/servers/rendering/renderer_rd/shaders/canvas.glsl index 45dc63aa17..8593e6b265 100644 --- a/servers/rendering/renderer_rd/shaders/canvas.glsl +++ b/servers/rendering/renderer_rd/shaders/canvas.glsl @@ -598,13 +598,11 @@ void main() {  		normal = normalize((canvas_data.canvas_normal_transform * vec4(normal, 0.0)).xyz);  	} -	vec3 base_color = color.rgb; +	vec4 base_color = color;  	if (bool(draw_data.flags & FLAGS_USING_LIGHT_MASK)) {  		color = vec4(0.0); //invisible by default due to using light mask  	} -	vec4 original_color = color; -  #ifdef MODE_LIGHT_ONLY  	color = vec4(0.0);  #elif !defined(MODE_UNSHADED) @@ -624,12 +622,14 @@ void main() {  #ifdef LIGHT_CODE_USED  		vec4 shadow_modulate = vec4(1.0); -		light_color = light_compute(light_vertex, vec3(direction, light_array.data[light_base].height), normal, light_color, light_color.a, specular_shininess, shadow_modulate, screen_uv, uv, color, true); +		light_color = light_compute(light_vertex, vec3(direction, light_array.data[light_base].height), normal, light_color, light_color.a, specular_shininess, shadow_modulate, screen_uv, uv, base_color, true);  #else  		if (normal_used) {  			vec3 light_vec = normalize(mix(vec3(direction, 0.0), vec3(0, 0, 1), light_array.data[light_base].height)); -			light_color.rgb = light_normal_compute(light_vec, normal, base_color, light_color.rgb, specular_shininess, specular_shininess_used); +			light_color.rgb = light_normal_compute(light_vec, normal, base_color.rgb, light_color.rgb, specular_shininess, specular_shininess_used); +		} else { +			light_color.rgb *= base_color.rgb;  		}  #endif @@ -646,8 +646,6 @@ void main() {  			);  		} -		light_color.rgb *= original_color.rgb; -  		light_blend_compute(light_base, light_color, color.rgb);  	} @@ -657,20 +655,7 @@ void main() {  		if (i >= light_count) {  			break;  		} -		uint light_base; -		if (i < 8) { -			if (i < 4) { -				light_base = draw_data.lights[0]; -			} else { -				light_base = draw_data.lights[1]; -			} -		} else { -			if (i < 12) { -				light_base = draw_data.lights[2]; -			} else { -				light_base = draw_data.lights[3]; -			} -		} +		uint light_base = draw_data.lights[i >> 2];  		light_base >>= (i & 3) * 8;  		light_base &= 0xFF; @@ -685,7 +670,7 @@ void main() {  		vec3 light_position = vec3(light_array.data[light_base].position, light_array.data[light_base].height);  		light_color.rgb *= light_base_color.rgb; -		light_color = light_compute(light_vertex, light_position, normal, light_color, light_base_color.a, specular_shininess, shadow_modulate, screen_uv, uv, color, false); +		light_color = light_compute(light_vertex, light_position, normal, light_color, light_base_color.a, specular_shininess, shadow_modulate, screen_uv, uv, base_color, false);  #else  		light_color.rgb *= light_base_color.rgb * light_base_color.a; @@ -695,7 +680,9 @@ void main() {  			vec3 pos = light_vertex;  			vec3 light_vec = normalize(light_pos - pos); -			light_color.rgb = light_normal_compute(light_vec, normal, base_color, light_color.rgb, specular_shininess, specular_shininess_used); +			light_color.rgb = light_normal_compute(light_vec, normal, base_color.rgb, light_color.rgb, specular_shininess, specular_shininess_used); +		} else { +			light_color.rgb *= base_color.rgb;  		}  #endif  		if (any(lessThan(tex_uv, vec2(0.0, 0.0))) || any(greaterThanEqual(tex_uv, vec2(1.0, 1.0)))) { @@ -743,8 +730,6 @@ void main() {  			);  		} -		light_color.rgb *= original_color.rgb; -  		light_blend_compute(light_base, light_color, color.rgb);  	}  #endif diff --git a/servers/rendering/renderer_rd/shaders/cluster_render.glsl b/servers/rendering/renderer_rd/shaders/cluster_render.glsl index 2fe230f0bf..8c26a67926 100644 --- a/servers/rendering/renderer_rd/shaders/cluster_render.glsl +++ b/servers/rendering/renderer_rd/shaders/cluster_render.glsl @@ -64,7 +64,7 @@ void main() {  #version 450  #VERSION_DEFINES - +#ifndef MOLTENVK_USED // Metal will corrupt GPU state otherwise  #if defined(has_GL_KHR_shader_subgroup_ballot) && defined(has_GL_KHR_shader_subgroup_arithmetic) && defined(has_GL_KHR_shader_subgroup_vote)  #extension GL_KHR_shader_subgroup_ballot : enable @@ -73,6 +73,7 @@ void main() {  #define USE_SUBGROUPS  #endif +#endif  layout(location = 0) in float depth_interp;  layout(location = 1) in flat uint element_index; @@ -141,7 +142,11 @@ void main() {  		}  	}  #else -	if (!gl_HelperInvocation) { +// MoltenVK/Metal fails to compile shaders using gl_HelperInvocation for some GPUs +#ifndef MOLTENVK_USED +	if (!gl_HelperInvocation) +#endif +	{  		atomicOr(cluster_render.data[usage_write_offset], usage_write_bit);  	}  #endif @@ -161,7 +166,11 @@ void main() {  		}  	}  #else -	if (!gl_HelperInvocation) { +// MoltenVK/Metal fails to compile shaders using gl_HelperInvocation for some GPUs +#ifndef MOLTENVK_USED +	if (!gl_HelperInvocation) +#endif +	{  		atomicOr(cluster_render.data[z_write_offset], z_write_bit);  	}  #endif diff --git a/servers/rendering/renderer_rd/shaders/effects/blur_raster.glsl b/servers/rendering/renderer_rd/shaders/effects/blur_raster.glsl index cb06250cf2..31aabbe9d2 100644 --- a/servers/rendering/renderer_rd/shaders/effects/blur_raster.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/blur_raster.glsl @@ -53,30 +53,31 @@ void main() {  #ifdef MODE_GAUSSIAN_BLUR -	// Simpler blur uses SIGMA2 for the gaussian kernel for a stronger effect - -	// note, for blur blur.luminance_multiplier is irrelavant, we would be multiplying and then dividing by this amount. - -	if (bool(blur.flags & FLAG_HORIZONTAL)) { -		vec2 pix_size = blur.pixel_size; -		pix_size *= 0.5; //reading from larger buffer, so use more samples -		vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.214607; -		color += texture(source_color, uv_interp + vec2(1.0, 0.0) * pix_size) * 0.189879; -		color += texture(source_color, uv_interp + vec2(2.0, 0.0) * pix_size) * 0.131514; -		color += texture(source_color, uv_interp + vec2(3.0, 0.0) * pix_size) * 0.071303; -		color += texture(source_color, uv_interp + vec2(-1.0, 0.0) * pix_size) * 0.189879; -		color += texture(source_color, uv_interp + vec2(-2.0, 0.0) * pix_size) * 0.131514; -		color += texture(source_color, uv_interp + vec2(-3.0, 0.0) * pix_size) * 0.071303; -		frag_color = color; -	} else { -		vec2 pix_size = blur.pixel_size; -		vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.38774; -		color += texture(source_color, uv_interp + vec2(0.0, 1.0) * pix_size) * 0.24477; -		color += texture(source_color, uv_interp + vec2(0.0, 2.0) * pix_size) * 0.06136; -		color += texture(source_color, uv_interp + vec2(0.0, -1.0) * pix_size) * 0.24477; -		color += texture(source_color, uv_interp + vec2(0.0, -2.0) * pix_size) * 0.06136; -		frag_color = color; -	} +	// For Gaussian Blur we use 13 taps in a single pass instead of 12 taps over 2 passes. +	// This minimizes the number of times we change framebuffers which is very important for mobile. +	// Source: http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare +	vec4 A = texture(source_color, uv_interp + blur.pixel_size * vec2(-1.0, -1.0)); +	vec4 B = texture(source_color, uv_interp + blur.pixel_size * vec2(0.0, -1.0)); +	vec4 C = texture(source_color, uv_interp + blur.pixel_size * vec2(1.0, -1.0)); +	vec4 D = texture(source_color, uv_interp + blur.pixel_size * vec2(-0.5, -0.5)); +	vec4 E = texture(source_color, uv_interp + blur.pixel_size * vec2(0.5, -0.5)); +	vec4 F = texture(source_color, uv_interp + blur.pixel_size * vec2(-1.0, 0.0)); +	vec4 G = texture(source_color, uv_interp); +	vec4 H = texture(source_color, uv_interp + blur.pixel_size * vec2(1.0, 0.0)); +	vec4 I = texture(source_color, uv_interp + blur.pixel_size * vec2(-0.5, 0.5)); +	vec4 J = texture(source_color, uv_interp + blur.pixel_size * vec2(0.5, 0.5)); +	vec4 K = texture(source_color, uv_interp + blur.pixel_size * vec2(-1.0, 1.0)); +	vec4 L = texture(source_color, uv_interp + blur.pixel_size * vec2(0.0, 1.0)); +	vec4 M = texture(source_color, uv_interp + blur.pixel_size * vec2(1.0, 1.0)); + +	float base_weight = 0.5 / 4.0; +	float lesser_weight = 0.125 / 4.0; + +	frag_color = (D + E + I + J) * base_weight; +	frag_color += (A + B + G + F) * lesser_weight; +	frag_color += (B + C + H + G) * lesser_weight; +	frag_color += (F + G + L + K) * lesser_weight; +	frag_color += (G + H + M + L) * lesser_weight;  #endif  #ifdef MODE_GAUSSIAN_GLOW diff --git a/servers/rendering/renderer_rd/shaders/effects/copy.glsl b/servers/rendering/renderer_rd/shaders/effects/copy.glsl index bfe329b8ec..5cc2ed7622 100644 --- a/servers/rendering/renderer_rd/shaders/effects/copy.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/copy.glsl @@ -194,10 +194,10 @@ void main() {  		color = min(color * feedback, vec4(params.glow_luminance_cap));  	} -#endif +#endif // MODE_GLOW  	imageStore(dest_buffer, pos + params.target, color); -#endif +#endif // MODE_GAUSSIAN_BLUR  #ifdef MODE_SIMPLE_COPY @@ -227,7 +227,7 @@ void main() {  	imageStore(dest_buffer, pos + params.target, color); -#endif +#endif // MODE_SIMPLE_COPY  #ifdef MODE_SIMPLE_COPY_DEPTH @@ -239,7 +239,7 @@ void main() {  	imageStore(dest_buffer, pos + params.target, vec4(color.r)); -#endif +#endif // MODE_SIMPLE_COPY_DEPTH  #ifdef MODE_LINEARIZE_DEPTH_COPY @@ -253,7 +253,7 @@ void main() {  	}  	imageStore(dest_buffer, pos + params.target, color); -#endif +#endif // MODE_LINEARIZE_DEPTH_COPY  #if defined(MODE_CUBEMAP_TO_PANORAMA) || defined(MODE_CUBEMAP_ARRAY_TO_PANORAMA) @@ -276,7 +276,7 @@ void main() {  	vec4 color = textureLod(source_color, vec4(normal, params.camera_z_far), 0.0); //the biggest the lod the least the acne  #endif  	imageStore(dest_buffer, pos + params.target, color); -#endif +#endif // defined(MODE_CUBEMAP_TO_PANORAMA) || defined(MODE_CUBEMAP_ARRAY_TO_PANORAMA)  #ifdef MODE_SET_COLOR  	imageStore(dest_buffer, pos + params.target, params.set_color); diff --git a/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl b/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl index 1c17eabb56..4d4e983b7f 100644 --- a/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl @@ -26,7 +26,11 @@ layout(push_constant, std430) uniform Params {  	bool use_section;  	bool force_luminance; -	uint pad[3]; +	bool alpha_to_zero; +	bool srgb; +	bool alpha_to_one; + +	vec4 color;  }  params; @@ -72,7 +76,9 @@ layout(push_constant, std430) uniform Params {  	bool force_luminance;  	bool alpha_to_zero;  	bool srgb; -	uint pad; +	bool alpha_to_one; + +	vec4 color;  }  params; @@ -105,6 +111,10 @@ vec3 linear_to_srgb(vec3 color) {  }  void main() { +#ifdef MODE_SET_COLOR +	frag_color = params.color; +#else +  #ifdef MULTIVIEW  	vec3 uv = uv_interp;  #else @@ -164,6 +174,10 @@ void main() {  	if (params.srgb) {  		color.rgb = linear_to_srgb(color.rgb);  	} +	if (params.alpha_to_one) { +		color.a = 1.0; +	}  	frag_color = color; +#endif // MODE_SET_COLOR  } diff --git a/servers/rendering/renderer_rd/shaders/effects/taa_resolve.glsl b/servers/rendering/renderer_rd/shaders/effects/taa_resolve.glsl index b0a0839836..02566d8e35 100644 --- a/servers/rendering/renderer_rd/shaders/effects/taa_resolve.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/taa_resolve.glsl @@ -32,7 +32,9 @@  // Based on Spartan Engine's TAA implementation (without TAA upscale).  // <https://github.com/PanosK92/SpartanEngine/blob/a8338d0609b85dc32f3732a5c27fb4463816a3b9/Data/shaders/temporal_antialiasing.hlsl> +#ifndef MOLTENVK_USED  #define USE_SUBGROUPS +#endif // MOLTENVK_USED  #define GROUP_SIZE 8  #define FLT_MIN 0.00000001 diff --git a/servers/rendering/renderer_rd/shaders/environment/volumetric_fog_process.glsl b/servers/rendering/renderer_rd/shaders/environment/volumetric_fog_process.glsl index eed9038502..28507e6c12 100644 --- a/servers/rendering/renderer_rd/shaders/environment/volumetric_fog_process.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/volumetric_fog_process.glsl @@ -381,7 +381,7 @@ void main() {  	float cell_depth_size = abs(view_pos.z - get_depth_at_pos(fog_cell_size.z, pos.z + 1));  	//compute directional lights -	if (total_density > 0.001) { +	if (total_density > 0.00005) {  		for (uint i = 0; i < params.directional_light_count; i++) {  			if (directional_lights.data[i].volumetric_fog_energy > 0.001) {  				vec3 shadow_attenuation = vec3(1.0); diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl index 1a8a1f3aa3..7440c5748b 100644 --- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl @@ -97,9 +97,7 @@ layout(location = 8) out vec4 prev_screen_position;  #ifdef MATERIAL_UNIFORMS_USED  layout(set = MATERIAL_UNIFORM_SET, binding = 0, std140) uniform MaterialUniforms{ -  #MATERIAL_UNIFORMS -  } material;  #endif @@ -691,7 +689,7 @@ vec4 fog_process(vec3 vertex) {  void cluster_get_item_range(uint p_offset, out uint item_min, out uint item_max, out uint item_from, out uint item_to) {  	uint item_min_max = cluster_buffer.data[p_offset]; -	item_min = item_min_max & 0xFFFF; +	item_min = item_min_max & 0xFFFFu;  	item_max = item_min_max >> 16;  	item_from = item_min >> 5; @@ -828,7 +826,8 @@ void fragment_shader(in SceneData scene_data) {  // alpha hash can be used in unison with alpha antialiasing  #ifdef ALPHA_HASH_USED -	if (alpha < compute_alpha_hash_threshold(vertex, alpha_hash_scale)) { +	vec3 object_pos = (inverse(read_model_matrix) * inv_view_matrix * vec4(vertex, 1.0)).xyz; +	if (alpha < compute_alpha_hash_threshold(object_pos, alpha_hash_scale)) {  		discard;  	}  #endif // ALPHA_HASH_USED @@ -958,9 +957,9 @@ void fragment_shader(in SceneData scene_data) {  			while (merged_mask != 0) {  				uint bit = findMSB(merged_mask); -				merged_mask &= ~(1 << bit); +				merged_mask &= ~(1u << bit);  #ifdef USE_SUBGROUPS -				if (((1 << bit) & mask) == 0) { //do not process if not originally here +				if (((1u << bit) & mask) == 0) { //do not process if not originally here  					continue;  				}  #endif @@ -1419,9 +1418,9 @@ void fragment_shader(in SceneData scene_data) {  			while (merged_mask != 0) {  				uint bit = findMSB(merged_mask); -				merged_mask &= ~(1 << bit); +				merged_mask &= ~(1u << bit);  #ifdef USE_SUBGROUPS -				if (((1 << bit) & mask) == 0) { //do not process if not originally here +				if (((1u << bit) & mask) == 0) { //do not process if not originally here  					continue;  				}  #endif @@ -1447,18 +1446,24 @@ void fragment_shader(in SceneData scene_data) {  	}  	//finalize ambient light here -	ambient_light *= albedo.rgb; -	ambient_light *= ao; +	{ +#if defined(AMBIENT_LIGHT_DISABLED) +		ambient_light = vec3(0.0, 0.0, 0.0); +#else +		ambient_light *= albedo.rgb; +		ambient_light *= ao; + +		if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL)) { +			vec4 ssil = textureLod(sampler2D(ssil_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv, 0.0); +			ambient_light *= 1.0 - ssil.a; +			ambient_light += ssil.rgb * albedo.rgb; +		} +#endif // AMBIENT_LIGHT_DISABLED +	}  	// convert ao to direct light ao  	ao = mix(1.0, ao, ao_light_affect); -	if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL)) { -		vec4 ssil = textureLod(sampler2D(ssil_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv, 0.0); -		ambient_light *= 1.0 - ssil.a; -		ambient_light += ssil.rgb * albedo.rgb; -	} -  	//this saves some VGPRs  	vec3 f0 = F0(metallic, specular, albedo); @@ -1775,9 +1780,9 @@ void fragment_shader(in SceneData scene_data) {  			float shadow = 1.0;  #ifndef SHADOWS_DISABLED  			if (i < 4) { -				shadow = float(shadow0 >> (i * 8) & 0xFF) / 255.0; +				shadow = float(shadow0 >> (i * 8u) & 0xFFu) / 255.0;  			} else { -				shadow = float(shadow1 >> ((i - 4) * 8) & 0xFF) / 255.0; +				shadow = float(shadow1 >> ((i - 4u) * 8u) & 0xFFu) / 255.0;  			}  			shadow = shadow * directional_lights.data[i].shadow_opacity + 1.0 - directional_lights.data[i].shadow_opacity; @@ -1839,9 +1844,9 @@ void fragment_shader(in SceneData scene_data) {  			while (merged_mask != 0) {  				uint bit = findMSB(merged_mask); -				merged_mask &= ~(1 << bit); +				merged_mask &= ~(1u << bit);  #ifdef USE_SUBGROUPS -				if (((1 << bit) & mask) == 0) { //do not process if not originally here +				if (((1u << bit) & mask) == 0) { //do not process if not originally here  					continue;  				}  #endif @@ -1910,9 +1915,9 @@ void fragment_shader(in SceneData scene_data) {  			while (merged_mask != 0) {  				uint bit = findMSB(merged_mask); -				merged_mask &= ~(1 << bit); +				merged_mask &= ~(1u << bit);  #ifdef USE_SUBGROUPS -				if (((1 << bit) & mask) == 0) { //do not process if not originally here +				if (((1u << bit) & mask) == 0) { //do not process if not originally here  					continue;  				}  #endif @@ -2065,7 +2070,7 @@ void fragment_shader(in SceneData scene_data) {  			float sGreen = floor((cGreen / pow(2.0f, exps - B - N)) + 0.5f);  			float sBlue = floor((cBlue / pow(2.0f, exps - B - N)) + 0.5f);  			//store as 8985 to have 2 extra neighbour bits -			uint light_rgbe = ((uint(sRed) & 0x1FF) >> 1) | ((uint(sGreen) & 0x1FF) << 8) | (((uint(sBlue) & 0x1FF) >> 1) << 17) | ((uint(exps) & 0x1F) << 25); +			uint light_rgbe = ((uint(sRed) & 0x1FFu) >> 1) | ((uint(sGreen) & 0x1FFu) << 8) | (((uint(sBlue) & 0x1FFu) >> 1) << 17) | ((uint(exps) & 0x1Fu) << 25);  			imageStore(emission_grid, grid_pos, uvec4(light_rgbe));  			imageStore(emission_aniso_grid, grid_pos, uvec4(light_aniso)); @@ -2099,8 +2104,8 @@ void fragment_shader(in SceneData scene_data) {  	if (bool(instances.data[instance_index].flags & INSTANCE_FLAGS_USE_VOXEL_GI)) { // process voxel_gi_instances  		uint index1 = instances.data[instance_index].gi_offset & 0xFFFF;  		uint index2 = instances.data[instance_index].gi_offset >> 16; -		voxel_gi_buffer.x = index1 & 0xFF; -		voxel_gi_buffer.y = index2 & 0xFF; +		voxel_gi_buffer.x = index1 & 0xFFu; +		voxel_gi_buffer.y = index2 & 0xFFu;  	} else {  		voxel_gi_buffer.x = 0xFF;  		voxel_gi_buffer.y = 0xFF; diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl index 0d36b98645..3a45ab0059 100644 --- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl @@ -4,14 +4,15 @@  #define MAX_VOXEL_GI_INSTANCES 8  #define MAX_VIEWS 2 +#ifndef MOLTENVK_USED  #if defined(has_GL_KHR_shader_subgroup_ballot) && defined(has_GL_KHR_shader_subgroup_arithmetic)  #extension GL_KHR_shader_subgroup_ballot : enable  #extension GL_KHR_shader_subgroup_arithmetic : enable  #define USE_SUBGROUPS -  #endif +#endif // MOLTENVK_USED  #if defined(USE_MULTIVIEW) && defined(has_VK_KHR_multiview)  #extension GL_EXT_multiview : enable diff --git a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl index 33fd4c35b1..cc44cff799 100644 --- a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl @@ -779,7 +779,8 @@ void main() {  // alpha hash can be used in unison with alpha antialiasing  #ifdef ALPHA_HASH_USED -	if (alpha < compute_alpha_hash_threshold(vertex, alpha_hash_scale)) { +	vec3 object_pos = (inverse(read_model_matrix) * inv_view_matrix * vec4(vertex, 1.0)).xyz; +	if (alpha < compute_alpha_hash_threshold(object_pos, alpha_hash_scale)) {  		discard;  	}  #endif // ALPHA_HASH_USED @@ -1172,8 +1173,14 @@ void main() {  	} //Reflection probes  	// finalize ambient light here -	ambient_light *= albedo.rgb; -	ambient_light *= ao; +	{ +#if defined(AMBIENT_LIGHT_DISABLED) +		ambient_light = vec3(0.0, 0.0, 0.0); +#else +		ambient_light *= albedo.rgb; +		ambient_light *= ao; +#endif // AMBIENT_LIGHT_DISABLED +	}  	// convert ao to direct light ao  	ao = mix(1.0, ao, ao_light_affect); diff --git a/servers/rendering/renderer_rd/shaders/particles.glsl b/servers/rendering/renderer_rd/shaders/particles.glsl index 3a6dd579b9..9f6aa7adc0 100644 --- a/servers/rendering/renderer_rd/shaders/particles.glsl +++ b/servers/rendering/renderer_rd/shaders/particles.glsl @@ -462,7 +462,7 @@ void main() {  					if (any(lessThan(uvw_pos, vec3(0.0))) || any(greaterThan(uvw_pos, vec3(1.0)))) {  						continue;  					} -					vec3 s = texture(sampler3D(sdf_vec_textures[FRAME.attractors[i].texture_index], material_samplers[SAMPLER_LINEAR_CLAMP]), uvw_pos).xyz * 2.0 - 1.0; +					vec3 s = texture(sampler3D(sdf_vec_textures[FRAME.attractors[i].texture_index], material_samplers[SAMPLER_LINEAR_CLAMP]), uvw_pos).xyz * -2.0 + 1.0;  					dir = mat3(FRAME.attractors[i].transform) * safe_normalize(s); //revert direction  					amount = length(s); diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_aa_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_aa_inc.glsl index 97c913d489..71510ee06a 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_aa_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_aa_inc.glsl @@ -11,7 +11,8 @@ float hash_3d(vec3 p) {  float compute_alpha_hash_threshold(vec3 pos, float hash_scale) {  	vec3 dx = dFdx(pos); -	vec3 dy = dFdx(pos); +	vec3 dy = dFdy(pos); +  	float delta_max_sqr = max(length(dx), length(dy));  	float pix_scale = 1.0 / (hash_scale * delta_max_sqr); @@ -32,9 +33,9 @@ float compute_alpha_hash_threshold(vec3 pos, float hash_scale) {  			1.0 - ((1.0 - a_interp) * (1.0 - a_interp) / (2.0 * min_lerp * (1.0 - min_lerp))));  	float alpha_hash_threshold = -			(lerp_factor < (1.0 - min_lerp)) ? ((lerp_factor < min_lerp) ? cases.x : cases.y) : cases.z; +			(a_interp < (1.0 - min_lerp)) ? ((a_interp < min_lerp) ? cases.x : cases.y) : cases.z; -	return clamp(alpha_hash_threshold, 0.0, 1.0); +	return clamp(alpha_hash_threshold, 0.00001, 1.0);  }  #endif // ALPHA_HASH_USED  |