diff options
Diffstat (limited to 'servers/rendering/renderer_rd/shaders/blit.glsl')
| -rw-r--r-- | servers/rendering/renderer_rd/shaders/blit.glsl | 97 | 
1 files changed, 97 insertions, 0 deletions
diff --git a/servers/rendering/renderer_rd/shaders/blit.glsl b/servers/rendering/renderer_rd/shaders/blit.glsl new file mode 100644 index 0000000000..8051f96738 --- /dev/null +++ b/servers/rendering/renderer_rd/shaders/blit.glsl @@ -0,0 +1,97 @@ +#[vertex] + +#version 450 + +#VERSION_DEFINES + +layout(push_constant, binding = 0, std140) uniform Pos { +	vec4 src_rect; +	vec4 dst_rect; + +	vec2 eye_center; +	float k1; +	float k2; + +	float upscale; +	float aspect_ratio; +	uint layer; +	uint pad1; +} +data; + +layout(location = 0) out vec2 uv; + +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 = data.src_rect.xy + base_arr[gl_VertexIndex] * data.src_rect.zw; +	vec2 vtx = data.dst_rect.xy + base_arr[gl_VertexIndex] * data.dst_rect.zw; +	gl_Position = vec4(vtx * 2.0 - 1.0, 0.0, 1.0); +} + +#[fragment] + +#version 450 + +#VERSION_DEFINES + +layout(push_constant, binding = 0, std140) uniform Pos { +	vec4 src_rect; +	vec4 dst_rect; + +	vec2 eye_center; +	float k1; +	float k2; + +	float upscale; +	float aspect_ratio; +	uint layer; +	uint pad1; +} +data; + +layout(location = 0) in vec2 uv; + +layout(location = 0) out vec4 color; + +#ifdef USE_LAYER +layout(binding = 0) uniform sampler2DArray src_rt; +#else +layout(binding = 0) uniform sampler2D src_rt; +#endif + +void main() { +#ifdef APPLY_LENS_DISTORTION +	vec2 coords = uv * 2.0 - 1.0; +	vec2 offset = coords - data.eye_center; + +	// take aspect ratio into account +	offset.y /= data.aspect_ratio; + +	// distort +	vec2 offset_sq = offset * offset; +	float radius_sq = offset_sq.x + offset_sq.y; +	float radius_s4 = radius_sq * radius_sq; +	float distortion_scale = 1.0 + (data.k1 * radius_sq) + (data.k2 * radius_s4); +	offset *= distortion_scale; + +	// reapply aspect ratio +	offset.y *= data.aspect_ratio; + +	// add our eye center back in +	coords = offset + data.eye_center; +	coords /= data.upscale; + +	// and check our color +	if (coords.x < -1.0 || coords.y < -1.0 || coords.x > 1.0 || coords.y > 1.0) { +		color = vec4(0.0, 0.0, 0.0, 1.0); +	} else { +		// layer is always used here +		coords = (coords + vec2(1.0)) / vec2(2.0); +		color = texture(src_rt, vec3(coords, data.layer)); +	} +#elif defined(USE_LAYER) +	color = texture(src_rt, vec3(uv, data.layer)); +#else +	color = texture(src_rt, uv); +#endif +}  |