diff options
Diffstat (limited to 'servers/rendering/renderer_rd/shaders')
29 files changed, 306 insertions, 171 deletions
diff --git a/servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl b/servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl index 12f57b0178..2ea6965c09 100644 --- a/servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/canvas_uniforms_inc.glsl @@ -138,10 +138,10 @@ layout(set = 0, binding = 7) uniform texture2D sdf_texture;  layout(set = 0, binding = 8) uniform sampler material_samplers[12]; -layout(set = 0, binding = 9, std430) restrict readonly buffer GlobalVariableData { +layout(set = 0, binding = 9, std430) restrict readonly buffer GlobalShaderUniformData {  	vec4 data[];  } -global_variables; +global_shader_uniforms;  /* SET1: Is reserved for the material */ diff --git a/servers/rendering/renderer_rd/shaders/screen_space_reflection.glsl b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl index a416891ff2..246ef81cb2 100644 --- a/servers/rendering/renderer_rd/shaders/screen_space_reflection.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl @@ -32,12 +32,17 @@ layout(push_constant, std430) uniform Params {  	bool use_half_res;  	uint metallic_mask; -	mat4 projection; +	uint view_index; +	uint pad1; +	uint pad2; +	uint pad3;  }  params; +#include "screen_space_reflection_inc.glsl" +  vec2 view_to_screen(vec3 view_pos, out float w) { -	vec4 projected = params.projection * vec4(view_pos, 1.0); +	vec4 projected = scene_data.projection[params.view_index] * vec4(view_pos, 1.0);  	projected.xyz /= projected.w;  	projected.xy = projected.xy * 0.5 + 0.5;  	w = projected.w; @@ -46,24 +51,16 @@ vec2 view_to_screen(vec3 view_pos, out float w) {  #define M_PI 3.14159265359 -vec3 reconstructCSPosition(vec2 S, float z) { -	if (params.orthogonal) { -		return vec3((S.xy * params.proj_info.xy + params.proj_info.zw), z); -	} else { -		return vec3((S.xy * params.proj_info.xy + params.proj_info.zw) * z, z); -	} -} -  void main() {  	// Pixel being shaded  	ivec2 ssC = ivec2(gl_GlobalInvocationID.xy); -	if (any(greaterThanEqual(ssC, params.screen_size))) { //too large, do nothing +	if (any(greaterThanEqual(ssC.xy, params.screen_size))) { //too large, do nothing  		return;  	}  	vec2 pixel_size = 1.0 / vec2(params.screen_size); -	vec2 uv = vec2(ssC) * pixel_size; +	vec2 uv = vec2(ssC.xy) * pixel_size;  	uv += pixel_size * 0.5; @@ -77,7 +74,12 @@ void main() {  	normal = normalize(normal);  	normal.y = -normal.y; //because this code reads flipped -	vec3 view_dir = normalize(vertex); +	vec3 view_dir; +	if (sc_multiview) { +		view_dir = normalize(vertex + scene_data.eye_offset[params.view_index].xyz); +	} else { +		view_dir = normalize(vertex); +	}  	vec3 ray_dir = normalize(reflect(view_dir, normal));  	if (dot(ray_dir, normal) < 0.001) { @@ -154,6 +156,11 @@ void main() {  		// convert to linear depth  		depth = imageLoad(source_depth, ivec2(pos - 0.5)).r; +		if (sc_multiview) { +			depth = depth * 2.0 - 1.0; +			depth = 2.0 * params.camera_z_near * params.camera_z_far / (params.camera_z_far + params.camera_z_near - depth * (params.camera_z_far - params.camera_z_near)); +			depth = -depth; +		}  		z_from = z_to;  		z_to = z / w; @@ -175,17 +182,18 @@ void main() {  	if (found) {  		float margin_blend = 1.0; -		vec2 margin = vec2((params.screen_size.x + params.screen_size.y) * 0.5 * 0.05); // make a uniform margin -		if (any(bvec4(lessThan(pos, -margin), greaterThan(pos, params.screen_size + margin)))) { -			// clip outside screen + margin +		vec2 margin = vec2((params.screen_size.x + params.screen_size.y) * 0.05); // make a uniform margin +		if (any(bvec4(lessThan(pos, vec2(0.0, 0.0)), greaterThan(pos, params.screen_size)))) { +			// clip at the screen edges  			imageStore(ssr_image, ssC, vec4(0.0));  			return;  		}  		{ -			//blend fading out towards external margin -			vec2 margin_grad = mix(pos - params.screen_size, -pos, lessThan(pos, vec2(0.0))); -			margin_blend = 1.0 - smoothstep(0.0, margin.x, max(margin_grad.x, margin_grad.y)); +			//blend fading out towards inner margin +			// 0.5 = midpoint of reflection +			vec2 margin_grad = mix(params.screen_size - pos, pos, lessThan(pos, params.screen_size * 0.5)); +			margin_blend = smoothstep(0.0, margin.x * margin.y, margin_grad.x * margin_grad.y);  			//margin_blend = 1.0;  		} @@ -222,13 +230,16 @@ void main() {  				blur_radius = (a * (sqrt(a2 + fh2) - a)) / (4.0f * h);  			}  		} + +		// 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 -#endif +#endif // MODE_ROUGH  		final_color = vec4(imageLoad(source_diffuse, ivec2(final_pos - 0.5)).rgb, fade * margin_blend); +  		//change blend by metallic  		vec4 metallic_mask = unpackUnorm4x8(params.metallic_mask);  		final_color.a *= dot(metallic_mask, texelFetch(source_metallic, ssC << 1, 0)); diff --git a/servers/rendering/renderer_rd/shaders/screen_space_reflection_filter.glsl b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_filter.glsl index 20e1712496..a63d60e0b2 100644 --- a/servers/rendering/renderer_rd/shaders/screen_space_reflection_filter.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_filter.glsl @@ -22,7 +22,7 @@ layout(push_constant, std430) uniform Params {  	bool orthogonal;  	float edge_tolerance;  	int increment; -	uint pad; +	uint view_index;  	ivec2 screen_size;  	bool vertical; @@ -30,6 +30,8 @@ layout(push_constant, std430) uniform Params {  }  params; +#include "screen_space_reflection_inc.glsl" +  #define GAUSS_TABLE_SIZE 15  const float gauss_table[GAUSS_TABLE_SIZE + 1] = float[]( @@ -64,14 +66,6 @@ float gauss_weight(float p_val) {  #define M_PI 3.14159265359 -vec3 reconstructCSPosition(vec2 S, float z) { -	if (params.orthogonal) { -		return vec3((S.xy * params.proj_info.xy + params.proj_info.zw), z); -	} else { -		return vec3((S.xy * params.proj_info.xy + params.proj_info.zw) * z, z); -	} -} -  void do_filter(inout vec4 accum, inout float accum_radius, inout float divisor, ivec2 texcoord, ivec2 increment, vec3 p_pos, vec3 normal, float p_limit_radius) {  	for (int i = 1; i < params.steps; i++) {  		float d = float(i * params.increment); @@ -110,7 +104,7 @@ void main() {  	// Pixel being shaded  	ivec2 ssC = ivec2(gl_GlobalInvocationID.xy); -	if (any(greaterThanEqual(ssC, params.screen_size))) { //too large, do nothing +	if (any(greaterThanEqual(ssC.xy, params.screen_size))) { //too large, do nothing  		return;  	} @@ -130,13 +124,13 @@ void main() {  	ivec2 direction = ivec2(params.increment, 0);  #endif  	float depth = imageLoad(source_depth, ssC).r; -	vec3 pos = reconstructCSPosition(vec2(ssC) + 0.5, depth); +	vec3 pos = reconstructCSPosition(vec2(ssC.xy) + 0.5, depth);  	vec3 normal = imageLoad(source_normal, ssC).xyz * 2.0 - 1.0;  	normal = normalize(normal);  	normal.y = -normal.y; -	do_filter(accum, accum_radius, divisor, ssC, direction, pos, normal, radius); -	do_filter(accum, accum_radius, divisor, ssC, -direction, pos, normal, radius); +	do_filter(accum, accum_radius, divisor, ssC.xy, direction, pos, normal, radius); +	do_filter(accum, accum_radius, divisor, ssC.xy, -direction, pos, normal, radius);  	if (divisor > 0.0) {  		accum /= divisor; diff --git a/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_inc.glsl b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_inc.glsl new file mode 100644 index 0000000000..26405ab040 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_inc.glsl @@ -0,0 +1,28 @@ +layout(constant_id = 0) const bool sc_multiview = false; + +layout(set = 4, binding = 0, std140) uniform SceneData { +	mat4x4 projection[2]; +	mat4x4 inv_projection[2]; +	vec4 eye_offset[2]; +} +scene_data; + +vec3 reconstructCSPosition(vec2 screen_pos, float z) { +	if (sc_multiview) { +		vec4 pos; +		pos.xy = (2.0 * vec2(screen_pos) / vec2(params.screen_size)) - 1.0; +		pos.z = z * 2.0 - 1.0; +		pos.w = 1.0; + +		pos = scene_data.inv_projection[params.view_index] * pos; +		pos.xyz /= pos.w; + +		return pos.xyz; +	} else { +		if (params.orthogonal) { +			return vec3((screen_pos.xy * params.proj_info.xy + params.proj_info.zw), z); +		} else { +			return vec3((screen_pos.xy * params.proj_info.xy + params.proj_info.zw) * z, z); +		} +	} +} diff --git a/servers/rendering/renderer_rd/shaders/screen_space_reflection_scale.glsl b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_scale.glsl index 3f537e273a..a7da0812df 100644 --- a/servers/rendering/renderer_rd/shaders/screen_space_reflection_scale.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection_scale.glsl @@ -6,6 +6,11 @@  layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; +/* Specialization Constants (Toggles) */ + +layout(constant_id = 0) const bool sc_multiview = false; + +/* inputs */  layout(set = 0, binding = 0) uniform sampler2D source_ssr;  layout(set = 1, binding = 0) uniform sampler2D source_depth;  layout(set = 1, binding = 1) uniform sampler2D source_normal; @@ -28,7 +33,7 @@ void main() {  	// Pixel being shaded  	ivec2 ssC = ivec2(gl_GlobalInvocationID.xy); -	if (any(greaterThanEqual(ssC, params.screen_size))) { //too large, do nothing +	if (any(greaterThanEqual(ssC.xy, params.screen_size))) { //too large, do nothing  		return;  	}  	//do not filter, SSR will generate arctifacts if this is done @@ -57,13 +62,19 @@ void main() {  			normal.xyz += nr.xyz * 2.0 - 1.0;  			normal.w += nr.w; -			d = d * 2.0 - 1.0; -			if (params.orthogonal) { -				d = ((d + (params.camera_z_far + params.camera_z_near) / (params.camera_z_far - params.camera_z_near)) * (params.camera_z_far - params.camera_z_near)) / 2.0; +			if (sc_multiview) { +				// we're doing a full unproject so we need the value as is. +				depth += d;  			} else { -				d = 2.0 * params.camera_z_near * params.camera_z_far / (params.camera_z_far + params.camera_z_near - d * (params.camera_z_far - params.camera_z_near)); +				// unproject our Z value so we can use it directly. +				d = d * 2.0 - 1.0; +				if (params.orthogonal) { +					d = ((d + (params.camera_z_far + params.camera_z_near) / (params.camera_z_far - params.camera_z_near)) * (params.camera_z_far - params.camera_z_near)) / 2.0; +				} else { +					d = 2.0 * params.camera_z_near * params.camera_z_far / (params.camera_z_far + params.camera_z_near - d * (params.camera_z_far - params.camera_z_near)); +				} +				depth += -d;  			} -			depth += -d;  		}  		color /= 4.0; @@ -71,17 +82,22 @@ void main() {  		normal.xyz = normalize(normal.xyz / 4.0) * 0.5 + 0.5;  		normal.w /= 4.0;  	} else { -		color = texelFetch(source_ssr, ssC << 1, 0); -		depth = texelFetch(source_depth, ssC << 1, 0).r; -		normal = texelFetch(source_normal, ssC << 1, 0); - -		depth = depth * 2.0 - 1.0; -		if (params.orthogonal) { -			depth = ((depth + (params.camera_z_far + params.camera_z_near) / (params.camera_z_far - params.camera_z_near)) * (params.camera_z_far - params.camera_z_near)) / 2.0; -		} else { -			depth = 2.0 * params.camera_z_near * params.camera_z_far / (params.camera_z_far + params.camera_z_near - depth * (params.camera_z_far - params.camera_z_near)); +		ivec2 ofs = ssC << 1; + +		color = texelFetch(source_ssr, ofs, 0); +		depth = texelFetch(source_depth, ofs, 0).r; +		normal = texelFetch(source_normal, ofs, 0); + +		if (!sc_multiview) { +			// unproject our Z value so we can use it directly. +			depth = depth * 2.0 - 1.0; +			if (params.orthogonal) { +				depth = ((depth + (params.camera_z_far + params.camera_z_near) / (params.camera_z_far - params.camera_z_near)) * (params.camera_z_far - params.camera_z_near)) / 2.0; +			} else { +				depth = 2.0 * params.camera_z_near * params.camera_z_far / (params.camera_z_far + params.camera_z_near - depth * (params.camera_z_far - params.camera_z_near)); +			} +			depth = -depth;  		} -		depth = -depth;  	}  	imageStore(dest_ssr, ssC, color); diff --git a/servers/rendering/renderer_rd/shaders/effects/specular_merge.glsl b/servers/rendering/renderer_rd/shaders/effects/specular_merge.glsl new file mode 100644 index 0000000000..c62144fdaf --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/effects/specular_merge.glsl @@ -0,0 +1,112 @@ +#[vertex] + +#version 450 + +#VERSION_DEFINES + +#if defined(USE_MULTIVIEW) && defined(has_VK_KHR_multiview) +#extension GL_EXT_multiview : enable +#endif + +#ifdef USE_MULTIVIEW +#ifdef has_VK_KHR_multiview +#define ViewIndex gl_ViewIndex +#else // has_VK_KHR_multiview +// !BAS! This needs to become an input once we implement our fallback! +#define ViewIndex 0 +#endif // has_VK_KHR_multiview +#else // USE_MULTIVIEW +// Set to zero, not supported in non stereo +#define ViewIndex 0 +#endif //USE_MULTIVIEW + +#ifdef USE_MULTIVIEW +layout(location = 0) out vec3 uv_interp; +#else // USE_MULTIVIEW +layout(location = 0) out vec2 uv_interp; +#endif //USE_MULTIVIEW + +void main() { +	vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)); + +#ifdef USE_MULTIVIEW +	uv_interp = vec3(base_arr[gl_VertexIndex], ViewIndex); + +	gl_Position = vec4(uv_interp.xy * 2.0 - 1.0, 0.0, 1.0); +#else +	uv_interp = base_arr[gl_VertexIndex]; + +	gl_Position = vec4(uv_interp * 2.0 - 1.0, 0.0, 1.0); +#endif +} + +#[fragment] + +#version 450 + +#VERSION_DEFINES + +#if defined(USE_MULTIVIEW) && defined(has_VK_KHR_multiview) +#extension GL_EXT_multiview : enable +#endif + +#ifdef USE_MULTIVIEW +#ifdef has_VK_KHR_multiview +#define ViewIndex gl_ViewIndex +#else // has_VK_KHR_multiview +// !BAS! This needs to become an input once we implement our fallback! +#define ViewIndex 0 +#endif // has_VK_KHR_multiview +#else // USE_MULTIVIEW +// Set to zero, not supported in non stereo +#define ViewIndex 0 +#endif //USE_MULTIVIEW + +#ifdef USE_MULTIVIEW +layout(location = 0) in vec3 uv_interp; +#else // USE_MULTIVIEW +layout(location = 0) in vec2 uv_interp; +#endif //USE_MULTIVIEW + +#ifdef USE_MULTIVIEW +layout(set = 0, binding = 0) uniform sampler2DArray specular; +#else // USE_MULTIVIEW +layout(set = 0, binding = 0) uniform sampler2D specular; +#endif //USE_MULTIVIEW + +#ifdef MODE_SSR + +#ifdef USE_MULTIVIEW +layout(set = 1, binding = 0) uniform sampler2DArray ssr; +#else // USE_MULTIVIEW +layout(set = 1, binding = 0) uniform sampler2D ssr; +#endif //USE_MULTIVIEW + +#endif + +#ifdef MODE_MERGE + +#ifdef USE_MULTIVIEW +layout(set = 2, binding = 0) uniform sampler2DArray diffuse; +#else // USE_MULTIVIEW +layout(set = 2, binding = 0) uniform sampler2D diffuse; +#endif //USE_MULTIVIEW + +#endif + +layout(location = 0) out vec4 frag_color; + +void main() { +	frag_color.rgb = texture(specular, uv_interp).rgb; +	frag_color.a = 0.0; +#ifdef MODE_SSR + +	vec4 ssr_color = texture(ssr, uv_interp); +	frag_color.rgb = mix(frag_color.rgb, ssr_color.rgb, ssr_color.a); +#endif + +#ifdef MODE_MERGE +	frag_color += texture(diffuse, uv_interp); +#endif +	//added using additive blend +} diff --git a/servers/rendering/renderer_rd/shaders/ss_effects_downsample.glsl b/servers/rendering/renderer_rd/shaders/effects/ss_effects_downsample.glsl index 134aae5ce7..134aae5ce7 100644 --- a/servers/rendering/renderer_rd/shaders/ss_effects_downsample.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ss_effects_downsample.glsl diff --git a/servers/rendering/renderer_rd/shaders/ssao.glsl b/servers/rendering/renderer_rd/shaders/effects/ssao.glsl index 2a87e273bc..2a87e273bc 100644 --- a/servers/rendering/renderer_rd/shaders/ssao.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ssao.glsl diff --git a/servers/rendering/renderer_rd/shaders/ssao_blur.glsl b/servers/rendering/renderer_rd/shaders/effects/ssao_blur.glsl index f42734c46d..f42734c46d 100644 --- a/servers/rendering/renderer_rd/shaders/ssao_blur.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ssao_blur.glsl diff --git a/servers/rendering/renderer_rd/shaders/ssao_importance_map.glsl b/servers/rendering/renderer_rd/shaders/effects/ssao_importance_map.glsl index 04f98964e8..04f98964e8 100644 --- a/servers/rendering/renderer_rd/shaders/ssao_importance_map.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ssao_importance_map.glsl diff --git a/servers/rendering/renderer_rd/shaders/ssao_interleave.glsl b/servers/rendering/renderer_rd/shaders/effects/ssao_interleave.glsl index f6a9a92fac..f6a9a92fac 100644 --- a/servers/rendering/renderer_rd/shaders/ssao_interleave.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ssao_interleave.glsl diff --git a/servers/rendering/renderer_rd/shaders/ssil.glsl b/servers/rendering/renderer_rd/shaders/effects/ssil.glsl index 513791dfbf..513791dfbf 100644 --- a/servers/rendering/renderer_rd/shaders/ssil.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ssil.glsl diff --git a/servers/rendering/renderer_rd/shaders/ssil_blur.glsl b/servers/rendering/renderer_rd/shaders/effects/ssil_blur.glsl index 47c56571f6..47c56571f6 100644 --- a/servers/rendering/renderer_rd/shaders/ssil_blur.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ssil_blur.glsl diff --git a/servers/rendering/renderer_rd/shaders/ssil_importance_map.glsl b/servers/rendering/renderer_rd/shaders/effects/ssil_importance_map.glsl index 6b6b02739d..6b6b02739d 100644 --- a/servers/rendering/renderer_rd/shaders/ssil_importance_map.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ssil_importance_map.glsl diff --git a/servers/rendering/renderer_rd/shaders/ssil_interleave.glsl b/servers/rendering/renderer_rd/shaders/effects/ssil_interleave.glsl index 9e86ac0cf0..9e86ac0cf0 100644 --- a/servers/rendering/renderer_rd/shaders/ssil_interleave.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/ssil_interleave.glsl diff --git a/servers/rendering/renderer_rd/shaders/environment/gi.glsl b/servers/rendering/renderer_rd/shaders/environment/gi.glsl index 5f34e7112d..6ea8cb1377 100644 --- a/servers/rendering/renderer_rd/shaders/environment/gi.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/gi.glsl @@ -659,7 +659,7 @@ void main() {  	if (sc_use_vrs) {  		ivec2 vrs_pos; -		// Currenty we use a 16x16 texel, possibly some day make this configurable. +		// Currently we use a 16x16 texel, possibly some day make this configurable.  		if (sc_half_res) {  			vrs_pos = pos >> 3;  		} else { diff --git a/servers/rendering/renderer_rd/shaders/environment/sdfgi_debug.glsl b/servers/rendering/renderer_rd/shaders/environment/sdfgi_debug.glsl index af5f7d0a58..9640d30e78 100644 --- a/servers/rendering/renderer_rd/shaders/environment/sdfgi_debug.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/sdfgi_debug.glsl @@ -37,16 +37,14 @@ layout(push_constant, std430) uniform Params {  	uint max_cascades;  	ivec2 screen_size; -	bool use_occlusion;  	float y_mult; -	int probe_axis_size;  	float z_near; -	float reserved1; -	float reserved2; -	mat4 cam_transform; -	mat4 inv_projection; +	mat3x4 inv_projection; +	// We pack these more tightly than mat3 and vec3, which will require some reconstruction trickery. +	float cam_basis[3][3]; +	float cam_origin[3];  }  params; @@ -82,13 +80,21 @@ void main() {  	vec3 ray_pos;  	vec3 ray_dir;  	{ -		ray_pos = params.cam_transform[3].xyz; +		ray_pos = vec3(params.cam_origin[0], params.cam_origin[1], params.cam_origin[2]);  		ray_dir.xy = ((vec2(screen_pos) / vec2(params.screen_size)) * 2.0 - 1.0);  		ray_dir.z = params.z_near; -		ray_dir = (params.inv_projection * vec4(ray_dir, 1.0)).xyz; -		ray_dir = normalize(mat3(params.cam_transform) * ray_dir); +		ray_dir = (vec4(ray_dir, 1.0) * mat4(params.inv_projection)).xyz; + +		mat3 cam_basis; +		{ +			vec3 c0 = vec3(params.cam_basis[0][0], params.cam_basis[0][1], params.cam_basis[0][2]); +			vec3 c1 = vec3(params.cam_basis[1][0], params.cam_basis[1][1], params.cam_basis[1][2]); +			vec3 c2 = vec3(params.cam_basis[2][0], params.cam_basis[2][1], params.cam_basis[2][2]); +			cam_basis = mat3(c0, c1, c2); +		} +		ray_dir = normalize(cam_basis * ray_dir);  	}  	ray_pos.y *= params.y_mult; diff --git a/servers/rendering/renderer_rd/shaders/sky.glsl b/servers/rendering/renderer_rd/shaders/environment/sky.glsl index 5b4594da99..e825020a4e 100644 --- a/servers/rendering/renderer_rd/shaders/sky.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/sky.glsl @@ -77,10 +77,10 @@ params;  layout(set = 0, binding = 0) uniform sampler material_samplers[12]; -layout(set = 0, binding = 1, std430) restrict readonly buffer GlobalVariableData { +layout(set = 0, binding = 1, std430) restrict readonly buffer GlobalShaderUniformData {  	vec4 data[];  } -global_variables; +global_shader_uniforms;  layout(set = 0, binding = 2, std140) uniform SceneData {  	bool volumetric_fog_enabled; diff --git a/servers/rendering/renderer_rd/shaders/volumetric_fog.glsl b/servers/rendering/renderer_rd/shaders/environment/volumetric_fog.glsl index eee609fb48..4658afd02d 100644 --- a/servers/rendering/renderer_rd/shaders/volumetric_fog.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/volumetric_fog.glsl @@ -21,17 +21,17 @@ layout(local_size_x = 4, local_size_y = 4, local_size_z = 4) in;  #define DENSITY_SCALE 1024.0 -#include "cluster_data_inc.glsl" -#include "light_data_inc.glsl" +#include "../cluster_data_inc.glsl" +#include "../light_data_inc.glsl"  #define M_PI 3.14159265359  layout(set = 0, binding = 1) uniform sampler material_samplers[12]; -layout(set = 0, binding = 2, std430) restrict readonly buffer GlobalVariableData { +layout(set = 0, binding = 2, std430) restrict readonly buffer GlobalShaderUniformData {  	vec4 data[];  } -global_variables; +global_shader_uniforms;  layout(push_constant, std430) uniform Params {  	vec3 position; diff --git a/servers/rendering/renderer_rd/shaders/volumetric_fog_process.glsl b/servers/rendering/renderer_rd/shaders/environment/volumetric_fog_process.glsl index fdbd7d3e35..6f79b9e771 100644 --- a/servers/rendering/renderer_rd/shaders/volumetric_fog_process.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/volumetric_fog_process.glsl @@ -19,8 +19,8 @@ layout(local_size_x = 4, local_size_y = 4, local_size_z = 4) in;  layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;  #endif -#include "cluster_data_inc.glsl" -#include "light_data_inc.glsl" +#include "../cluster_data_inc.glsl" +#include "../light_data_inc.glsl"  #define M_PI 3.14159265359 @@ -377,7 +377,7 @@ void main() {  		for (uint i = 0; i < params.directional_light_count; i++) {  			vec3 shadow_attenuation = vec3(1.0); -			if (directional_lights.data[i].shadow_enabled) { +			if (directional_lights.data[i].shadow_opacity > 0.001) {  				float depth_z = -view_pos.z;  				vec4 pssm_coord; @@ -486,7 +486,7 @@ void main() {  						vec3 light = omni_lights.data[light_index].color; -						if (omni_lights.data[light_index].shadow_enabled) { +						if (omni_lights.data[light_index].shadow_opacity > 0.001) {  							//has shadow  							vec4 uv_rect = omni_lights.data[light_index].atlas_rect;  							vec2 flip_offset = omni_lights.data[light_index].direction.xy; @@ -572,7 +572,7 @@ void main() {  						vec3 light = spot_lights.data[light_index].color; -						if (spot_lights.data[light_index].shadow_enabled) { +						if (spot_lights.data[light_index].shadow_opacity > 0.001) {  							//has shadow  							vec4 uv_rect = spot_lights.data[light_index].atlas_rect;  							vec2 flip_offset = spot_lights.data[light_index].direction.xy; diff --git a/servers/rendering/renderer_rd/shaders/light_data_inc.glsl b/servers/rendering/renderer_rd/shaders/light_data_inc.glsl index 61c8488a05..799f7087b6 100644 --- a/servers/rendering/renderer_rd/shaders/light_data_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/light_data_inc.glsl @@ -15,7 +15,7 @@ struct LightData { //this structure needs to be as packed as possible  	mediump float cone_attenuation;  	mediump float cone_angle;  	mediump float specular_amount; -	bool shadow_enabled; +	mediump float shadow_opacity;  	highp vec4 atlas_rect; // rect in the shadow atlas  	highp mat4 shadow_matrix; @@ -60,7 +60,7 @@ struct DirectionalLightData {  	highp float softshadow_angle;  	highp float soft_shadow_scale;  	bool blend_splits; -	bool shadow_enabled; +	mediump float shadow_opacity;  	highp float fade_from;  	highp float fade_to;  	uvec2 pad; diff --git a/servers/rendering/renderer_rd/shaders/particles.glsl b/servers/rendering/renderer_rd/shaders/particles.glsl index acb62b812e..fb5759bc17 100644 --- a/servers/rendering/renderer_rd/shaders/particles.glsl +++ b/servers/rendering/renderer_rd/shaders/particles.glsl @@ -25,10 +25,10 @@ layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;  layout(set = 0, binding = 1) uniform sampler material_samplers[12]; -layout(set = 0, binding = 2, std430) restrict readonly buffer GlobalVariableData { +layout(set = 0, binding = 2, std430) restrict readonly buffer GlobalShaderUniformData {  	vec4 data[];  } -global_variables; +global_shader_uniforms;  /* Set 1: FRAME AND PARTICLE DATA */ @@ -458,11 +458,11 @@ void main() {  				} break;  				case ATTRACTOR_TYPE_VECTOR_FIELD: { -					vec3 uvw_pos = (local_pos / FRAME.attractors[i].extents) * 2.0 - 1.0; +					vec3 uvw_pos = (local_pos / FRAME.attractors[i].extents + 1.0) * 0.5;  					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; +					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_clustered.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl index 5947fc5351..e9515c7670 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl @@ -947,9 +947,9 @@ void fragment_shader(in SceneData scene_data) {  				if (decals.data[decal_index].emission_rect != vec4(0.0)) {  					//emission is additive, so its independent from albedo  					if (sc_decal_use_mipmaps) { -						emission += textureGrad(sampler2D(decal_atlas_srgb, decal_sampler), uv_local.xz * decals.data[decal_index].emission_rect.zw + decals.data[decal_index].emission_rect.xy, ddx * decals.data[decal_index].emission_rect.zw, ddy * decals.data[decal_index].emission_rect.zw).xyz * decals.data[decal_index].emission_energy * fade; +						emission += textureGrad(sampler2D(decal_atlas_srgb, decal_sampler), uv_local.xz * decals.data[decal_index].emission_rect.zw + decals.data[decal_index].emission_rect.xy, ddx * decals.data[decal_index].emission_rect.zw, ddy * decals.data[decal_index].emission_rect.zw).xyz * decals.data[decal_index].modulate.rgb * decals.data[decal_index].emission_energy * fade;  					} else { -						emission += textureLod(sampler2D(decal_atlas_srgb, decal_sampler), uv_local.xz * decals.data[decal_index].emission_rect.zw + decals.data[decal_index].emission_rect.xy, 0.0).xyz * decals.data[decal_index].emission_energy * fade; +						emission += textureLod(sampler2D(decal_atlas_srgb, decal_sampler), uv_local.xz * decals.data[decal_index].emission_rect.zw + decals.data[decal_index].emission_rect.xy, 0.0).xyz * decals.data[decal_index].modulate.rgb * decals.data[decal_index].emission_energy * fade;  					}  				}  			} @@ -988,8 +988,10 @@ void fragment_shader(in SceneData scene_data) {  		vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction);  		vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0)));  		vec3 ref_vec = reflect(-view, bent_normal); +		ref_vec = mix(ref_vec, bent_normal, roughness * roughness);  #else  		vec3 ref_vec = reflect(-view, normal); +		ref_vec = mix(ref_vec, normal, roughness * roughness);  #endif  		float horizon = min(1.0 + dot(ref_vec, normal), 1.0); @@ -1046,6 +1048,7 @@ void fragment_shader(in SceneData scene_data) {  		ambient_light *= attenuation;  		specular_light *= attenuation; +		ref_vec = mix(ref_vec, n, clearcoat_roughness * clearcoat_roughness);  		float horizon = min(1.0 + dot(ref_vec, normal), 1.0);  		ref_vec = scene_data.radiance_inverse_xform * ref_vec;  		float roughness_lod = mix(0.001, 0.1, clearcoat_roughness) * MAX_ROUGHNESS_LOD; @@ -1203,6 +1206,7 @@ void fragment_shader(in SceneData scene_data) {  		uint index1 = instances.data[instance_index].gi_offset & 0xFFFF;  		vec3 ref_vec = normalize(reflect(-view, normal)); +		ref_vec = mix(ref_vec, normal, roughness * roughness);  		//find arbitrary tangent and bitangent, then build a matrix  		vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0);  		vec3 tangent = normalize(cross(v0, normal)); @@ -1302,6 +1306,18 @@ void fragment_shader(in SceneData scene_data) {  		item_to = subgroupBroadcastFirst(subgroupMax(item_to));  #endif +#ifdef LIGHT_ANISOTROPY_USED +		// https://google.github.io/filament/Filament.html#lighting/imagebasedlights/anisotropy +		vec3 anisotropic_direction = anisotropy >= 0.0 ? binormal : tangent; +		vec3 anisotropic_tangent = cross(anisotropic_direction, view); +		vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction); +		vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0))); +#else +		vec3 bent_normal = normal; +#endif +		vec3 ref_vec = normalize(reflect(-view, bent_normal)); +		ref_vec = mix(ref_vec, bent_normal, roughness * roughness); +  		for (uint i = item_from; i < item_to; i++) {  			uint mask = cluster_buffer.data[cluster_reflection_offset + i];  			mask &= cluster_get_range_clip_mask(i, item_min, item_max); @@ -1324,16 +1340,8 @@ void fragment_shader(in SceneData scene_data) {  				if (!bool(reflections.data[reflection_index].mask & instances.data[instance_index].layer_mask)) {  					continue; //not masked  				} -#ifdef LIGHT_ANISOTROPY_USED -				// https://google.github.io/filament/Filament.html#lighting/imagebasedlights/anisotropy -				vec3 anisotropic_direction = anisotropy >= 0.0 ? binormal : tangent; -				vec3 anisotropic_tangent = cross(anisotropic_direction, view); -				vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction); -				vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0))); -#else -				vec3 bent_normal = normal; -#endif -				reflection_process(reflection_index, view, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum); + +				reflection_process(reflection_index, vertex, ref_vec, normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);  			}  		} @@ -1381,7 +1389,7 @@ void fragment_shader(in SceneData scene_data) {  		float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y;  		vec2 env = vec2(-1.04, 1.04) * a004 + r.zw; -		specular_light *= env.x * f0 + env.y; +		specular_light *= env.x * f0 + env.y * clamp(50.0 * f0.g, 0.0, 1.0);  #endif  	} @@ -1417,7 +1425,7 @@ void fragment_shader(in SceneData scene_data) {  			float shadow = 1.0; -			if (directional_lights.data[i].shadow_enabled) { +			if (directional_lights.data[i].shadow_opacity > 0.001) {  				float depth_z = -vertex.z;  				vec3 light_dir = directional_lights.data[i].direction;  				vec3 base_normal_bias = normalize(normal_interp) * (1.0 - max(0.0, dot(light_dir, -normalize(normal_interp)))); @@ -1626,7 +1634,7 @@ void fragment_shader(in SceneData scene_data) {  #ifdef LIGHT_TRANSMITTANCE_USED  			float transmittance_z = transmittance_depth; -			if (directional_lights.data[i].shadow_enabled) { +			if (directional_lights.data[i].shadow_opacity > 0.001) {  				float depth_z = -vertex.z;  				if (depth_z < directional_lights.data[i].shadow_split_offsets.x) { @@ -1681,6 +1689,8 @@ void fragment_shader(in SceneData scene_data) {  			} else {  				shadow = float(shadow1 >> ((i - 4) * 8) & 0xFF) / 255.0;  			} + +			shadow = shadow * directional_lights.data[i].shadow_opacity + 1.0 - directional_lights.data[i].shadow_opacity;  #endif  			blur_shadow(shadow); diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl index 0c23de96c3..f0717294ef 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_clustered_inc.glsl @@ -129,10 +129,10 @@ layout(set = 0, binding = 13, std430) restrict readonly buffer Decals {  }  decals; -layout(set = 0, binding = 14, std430) restrict readonly buffer GlobalVariableData { +layout(set = 0, binding = 14, std430) restrict readonly buffer GlobalShaderUniformData {  	vec4 data[];  } -global_variables; +global_shader_uniforms;  struct SDFVoxelGICascadeData {  	vec3 position; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl index c92b29b14a..7299bb0576 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl @@ -199,7 +199,10 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte  #endif // LIGHT_ANISOTROPY_USED  	   // F  		float cLdotH5 = SchlickFresnel(cLdotH); -		vec3 F = mix(vec3(cLdotH5), vec3(1.0), f0); +		// Calculate Fresnel using specular occlusion term from Filament: +		// https://google.github.io/filament/Filament.html#lighting/occlusion/specularocclusion +		float f90 = clamp(dot(f0, vec3(50.0 * 0.33)), 0.0, 1.0); +		vec3 F = f0 + (f90 - f0) * cLdotH5;  		vec3 specular_brdf_NL = cNdotL * D * F * G; @@ -392,7 +395,7 @@ float get_omni_attenuation(float distance, float inv_range, float decay) {  float light_process_omni_shadow(uint idx, vec3 vertex, vec3 normal) {  #ifndef SHADOWS_DISABLED -	if (omni_lights.data[idx].shadow_enabled) { +	if (omni_lights.data[idx].shadow_opacity > 0.001) {  		// there is a shadowmap  		vec2 texel_size = scene_data_block.data.shadow_atlas_pixel_size;  		vec4 base_uv_rect = omni_lights.data[idx].atlas_rect; @@ -495,6 +498,7 @@ float light_process_omni_shadow(uint idx, vec3 vertex, vec3 normal) {  				}  				shadow /= float(sc_penumbra_shadow_samples); +				shadow = mix(1.0, shadow, omni_lights.data[idx].shadow_opacity);  			} else {  				//no blockers found, so no shadow @@ -513,7 +517,7 @@ float light_process_omni_shadow(uint idx, vec3 vertex, vec3 normal) {  			vec2 pos = shadow_sample.xy / shadow_sample.z;  			float depth = shadow_len - omni_lights.data[idx].shadow_bias;  			depth *= omni_lights.data[idx].inv_radius; -			shadow = sample_omni_pcf_shadow(shadow_atlas, omni_lights.data[idx].soft_shadow_scale / shadow_sample.z, pos, uv_rect, flip_offset, depth); +			shadow = mix(1.0, sample_omni_pcf_shadow(shadow_atlas, omni_lights.data[idx].soft_shadow_scale / shadow_sample.z, pos, uv_rect, flip_offset, depth), omni_lights.data[idx].shadow_opacity);  		}  		return shadow; @@ -671,7 +675,7 @@ void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v  float light_process_spot_shadow(uint idx, vec3 vertex, vec3 normal) {  #ifndef SHADOWS_DISABLED -	if (spot_lights.data[idx].shadow_enabled) { +	if (spot_lights.data[idx].shadow_opacity > 0.001) {  		vec3 light_rel_vec = spot_lights.data[idx].position - vertex;  		float light_length = length(light_rel_vec);  		vec3 spot_dir = spot_lights.data[idx].direction; @@ -732,6 +736,7 @@ float light_process_spot_shadow(uint idx, vec3 vertex, vec3 normal) {  				}  				shadow /= float(sc_penumbra_shadow_samples); +				shadow = mix(1.0, shadow, spot_lights.data[idx].shadow_opacity);  			} else {  				//no blockers found, so no shadow @@ -740,7 +745,7 @@ float light_process_spot_shadow(uint idx, vec3 vertex, vec3 normal) {  		} else {  			//hard shadow  			vec3 shadow_uv = vec3(splane.xy * spot_lights.data[idx].atlas_rect.zw + spot_lights.data[idx].atlas_rect.xy, splane.z); -			shadow = sample_pcf_shadow(shadow_atlas, spot_lights.data[idx].soft_shadow_scale * scene_data_block.data.shadow_atlas_pixel_size, shadow_uv); +			shadow = mix(1.0, sample_pcf_shadow(shadow_atlas, spot_lights.data[idx].soft_shadow_scale * scene_data_block.data.shadow_atlas_pixel_size, shadow_uv), spot_lights.data[idx].shadow_opacity);  		}  		return shadow; @@ -869,7 +874,7 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v  			diffuse_light, specular_light);  } -void reflection_process(uint ref_index, vec3 view, vec3 vertex, vec3 normal, float roughness, vec3 ambient_light, vec3 specular_light, inout vec4 ambient_accum, inout vec4 reflection_accum) { +void reflection_process(uint ref_index, vec3 vertex, vec3 ref_vec, vec3 normal, float roughness, vec3 ambient_light, vec3 specular_light, inout vec4 ambient_accum, inout vec4 reflection_accum) {  	vec3 box_extents = reflections.data[ref_index].box_extents;  	vec3 local_pos = (reflections.data[ref_index].local_matrix * vec4(vertex, 1.0)).xyz; @@ -877,8 +882,6 @@ void reflection_process(uint ref_index, vec3 view, vec3 vertex, vec3 normal, flo  		return;  	} -	vec3 ref_vec = normalize(reflect(-view, normal)); -  	vec3 inner_pos = abs(local_pos / box_extents);  	float blend = max(inner_pos.x, max(inner_pos.y, inner_pos.z));  	//make blend more rounded diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl index 26d0de46c2..6548793bee 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl @@ -889,8 +889,10 @@ void main() {  		vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction);  		vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0)));  		vec3 ref_vec = reflect(-view, bent_normal); +		ref_vec = mix(ref_vec, bent_normal, roughness * roughness);  #else  		vec3 ref_vec = reflect(-view, normal); +		ref_vec = mix(ref_vec, normal, roughness * roughness);  #endif  		float horizon = min(1.0 + dot(ref_vec, normal), 1.0);  		ref_vec = scene_data.radiance_inverse_xform * ref_vec; @@ -940,6 +942,7 @@ void main() {  		vec3 n = normalize(normal_interp); // We want to use geometric normal, not normal_map  		float NoV = max(dot(n, view), 0.0001);  		vec3 ref_vec = reflect(-view, n); +		ref_vec = mix(ref_vec, n, clearcoat_roughness * clearcoat_roughness);  		// The clear coat layer assumes an IOR of 1.5 (4% reflectance)  		float Fc = clearcoat * (0.04 + 0.96 * SchlickFresnel(NoV));  		float attenuation = 1.0 - Fc; @@ -1036,6 +1039,19 @@ void main() {  		vec4 ambient_accum = vec4(0.0, 0.0, 0.0, 0.0);  		uint reflection_indices = draw_call.reflection_probes.x; + +#ifdef LIGHT_ANISOTROPY_USED +		// https://google.github.io/filament/Filament.html#lighting/imagebasedlights/anisotropy +		vec3 anisotropic_direction = anisotropy >= 0.0 ? binormal : tangent; +		vec3 anisotropic_tangent = cross(anisotropic_direction, view); +		vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction); +		vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0))); +#else +		vec3 bent_normal = normal; +#endif +		vec3 ref_vec = normalize(reflect(-view, bent_normal)); +		ref_vec = mix(ref_vec, bent_normal, roughness * roughness); +  		for (uint i = 0; i < 8; i++) {  			uint reflection_index = reflection_indices & 0xFF;  			if (i == 4) { @@ -1047,16 +1063,8 @@ void main() {  			if (reflection_index == 0xFF) {  				break;  			} -#ifdef LIGHT_ANISOTROPY_USED -			// https://google.github.io/filament/Filament.html#lighting/imagebasedlights/anisotropy -			vec3 anisotropic_direction = anisotropy >= 0.0 ? binormal : tangent; -			vec3 anisotropic_tangent = cross(anisotropic_direction, view); -			vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction); -			vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0))); -#else -			vec3 bent_normal = normal; -#endif -			reflection_process(reflection_index, view, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum); + +			reflection_process(reflection_index, vertex, ref_vec, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);  		}  		if (reflection_accum.a > 0.0) { @@ -1134,7 +1142,7 @@ void main() {  #ifdef USE_SOFT_SHADOWS  			//version with soft shadows, more expensive -			if (directional_lights.data[i].shadow_enabled) { +			if (directional_lights.data[i].shadow_opacity > 0.001) {  				float depth_z = -vertex.z;  				vec4 pssm_coord; @@ -1286,7 +1294,7 @@ void main() {  #else  			// Soft shadow disabled version -			if (directional_lights.data[i].shadow_enabled) { +			if (directional_lights.data[i].shadow_opacity > 0.001) {  				float depth_z = -vertex.z;  				vec4 pssm_coord; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl index 7413d8730a..98ad674ce0 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_mobile_inc.glsl @@ -118,10 +118,10 @@ layout(set = 0, binding = 13, std430) restrict readonly buffer Decals {  }  decals; -layout(set = 0, binding = 14, std430) restrict readonly buffer GlobalVariableData { +layout(set = 0, binding = 14, std430) restrict readonly buffer GlobalShaderUniformData {  	highp vec4 data[];  } -global_variables; +global_shader_uniforms;  /* Set 1: Render Pass (changes per render pass) */ diff --git a/servers/rendering/renderer_rd/shaders/specular_merge.glsl b/servers/rendering/renderer_rd/shaders/specular_merge.glsl deleted file mode 100644 index 3579c35cce..0000000000 --- a/servers/rendering/renderer_rd/shaders/specular_merge.glsl +++ /dev/null @@ -1,53 +0,0 @@ -#[vertex] - -#version 450 - -#VERSION_DEFINES - -layout(location = 0) out vec2 uv_interp; - -void main() { -	vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)); -	uv_interp = base_arr[gl_VertexIndex]; - -	gl_Position = vec4(uv_interp * 2.0 - 1.0, 0.0, 1.0); -} - -#[fragment] - -#version 450 - -#VERSION_DEFINES - -layout(location = 0) in vec2 uv_interp; - -layout(set = 0, binding = 0) uniform sampler2D specular; - -#ifdef MODE_SSR - -layout(set = 1, binding = 0) uniform sampler2D ssr; - -#endif - -#ifdef MODE_MERGE - -layout(set = 2, binding = 0) uniform sampler2D diffuse; - -#endif - -layout(location = 0) out vec4 frag_color; - -void main() { -	frag_color.rgb = texture(specular, uv_interp).rgb; -	frag_color.a = 0.0; -#ifdef MODE_SSR - -	vec4 ssr_color = texture(ssr, uv_interp); -	frag_color.rgb = mix(frag_color.rgb, ssr_color.rgb, ssr_color.a); -#endif - -#ifdef MODE_MERGE -	frag_color += texture(diffuse, uv_interp); -#endif -	//added using additive blend -} diff --git a/servers/rendering/renderer_rd/shaders/taa_resolve.glsl b/servers/rendering/renderer_rd/shaders/taa_resolve.glsl index ddd984ad83..b0a0839836 100644 --- a/servers/rendering/renderer_rd/shaders/taa_resolve.glsl +++ b/servers/rendering/renderer_rd/shaders/taa_resolve.glsl @@ -189,7 +189,7 @@ vec3 sample_catmull_rom_9(sampler2D stex, vec2 uv, vec2 resolution) {  	// Source: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1  	// License: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae -	// We're going to sample a a 4x4 grid of texels surrounding the target UV coordinate. We'll do this by rounding +	// We're going to sample a 4x4 grid of texels surrounding the target UV coordinate. We'll do this by rounding  	// down the sample location to get the exact center of our "starting" texel. The starting texel will be at  	// location [1, 1] in the grid, where [0, 0] is the top left corner.  	vec2 sample_pos = uv * resolution;  |