From 75e61e5a6dc70107eaf784a369f225ca062fdcd5 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 28 Jan 2022 15:00:26 +0100 Subject: Image Engine: Use GPUShaderCreateInfo. Ported the image engine shaders to use the GPUShaderCreateInfo struct. No functional changes. --- source/blender/draw/CMakeLists.txt | 4 +- .../draw/engines/image/image_drawing_mode.hh | 2 +- source/blender/draw/engines/image/image_shader.cc | 6 +-- .../engines/image/shaders/engine_image_frag.glsl | 62 ---------------------- .../engines/image/shaders/engine_image_vert.glsl | 19 ------- .../engines/image/shaders/image_engine_frag.glsl | 45 ++++++++++++++++ .../engines/image/shaders/image_engine_vert.glsl | 12 +++++ .../image/shaders/infos/engine_image_info.hh | 22 ++++++++ 8 files changed, 83 insertions(+), 89 deletions(-) delete mode 100644 source/blender/draw/engines/image/shaders/engine_image_frag.glsl delete mode 100644 source/blender/draw/engines/image/shaders/engine_image_vert.glsl create mode 100644 source/blender/draw/engines/image/shaders/image_engine_frag.glsl create mode 100644 source/blender/draw/engines/image/shaders/image_engine_vert.glsl create mode 100644 source/blender/draw/engines/image/shaders/infos/engine_image_info.hh (limited to 'source/blender/draw') diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index b40fc88a076..f4e57d9521b 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -518,8 +518,8 @@ set(GLSL_SRC engines/overlay/shaders/wireframe_frag.glsl engines/overlay/shaders/xray_fade_frag.glsl - engines/image/shaders/engine_image_frag.glsl - engines/image/shaders/engine_image_vert.glsl + engines/image/shaders/image_engine_frag.glsl + engines/image/shaders/image_engine_vert.glsl ) set(GLSL_C) diff --git a/source/blender/draw/engines/image/image_drawing_mode.hh b/source/blender/draw/engines/image/image_drawing_mode.hh index 8eb98b40492..c0d829b9307 100644 --- a/source/blender/draw/engines/image/image_drawing_mode.hh +++ b/source/blender/draw/engines/image/image_drawing_mode.hh @@ -94,7 +94,7 @@ template class ScreenSpaceDrawingMode : public AbstractD DRWShadingGroup *shgrp = DRW_shgroup_create(shader, instance_data->passes.image_pass); DRW_shgroup_uniform_vec2_copy(shgrp, "farNearDistances", sh_params.far_near); - DRW_shgroup_uniform_vec4_copy(shgrp, "color", ShaderParameters::color); + DRW_shgroup_uniform_vec4_copy(shgrp, "col", ShaderParameters::color); DRW_shgroup_uniform_vec4_copy(shgrp, "shuffle", sh_params.shuffle); DRW_shgroup_uniform_int_copy(shgrp, "drawFlags", sh_params.flags); DRW_shgroup_uniform_bool_copy(shgrp, "imgPremultiplied", sh_params.use_premul_alpha); diff --git a/source/blender/draw/engines/image/image_shader.cc b/source/blender/draw/engines/image/image_shader.cc index 77cbaeec5a4..e3cb60c5511 100644 --- a/source/blender/draw/engines/image/image_shader.cc +++ b/source/blender/draw/engines/image/image_shader.cc @@ -64,11 +64,7 @@ GPUShader *IMAGE_shader_image_get() { IMAGE_Shaders *sh_data = &e_data.shaders; if (sh_data->image_sh == nullptr) { - sh_data->image_sh = DRW_shader_create_with_shaderlib(datatoc_engine_image_vert_glsl, - nullptr, - datatoc_engine_image_frag_glsl, - e_data.lib, - nullptr); + sh_data->image_sh = GPU_shader_create_from_info_name("image_engine_shader"); } return sh_data->image_sh; } diff --git a/source/blender/draw/engines/image/shaders/engine_image_frag.glsl b/source/blender/draw/engines/image/shaders/engine_image_frag.glsl deleted file mode 100644 index 298487baab2..00000000000 --- a/source/blender/draw/engines/image/shaders/engine_image_frag.glsl +++ /dev/null @@ -1,62 +0,0 @@ -#pragma BLENDER_REQUIRE(common_colormanagement_lib.glsl) - -/* Keep in sync with image_engine.c */ -#define IMAGE_DRAW_FLAG_SHOW_ALPHA (1 << 0) -#define IMAGE_DRAW_FLAG_APPLY_ALPHA (1 << 1) -#define IMAGE_DRAW_FLAG_SHUFFLING (1 << 2) -#define IMAGE_DRAW_FLAG_DEPTH (1 << 3) - -uniform sampler2D imageTexture; - -uniform bool imgPremultiplied; -uniform int drawFlags; -uniform vec2 farNearDistances; -uniform vec4 color; -uniform vec4 shuffle; - -/* Maximum UV range. - * Negative UV coordinates and UV coordinates beyond maxUV would draw a border. */ -uniform vec2 maxUv; - -#define FAR_DISTANCE farNearDistances.x -#define NEAR_DISTANCE farNearDistances.y - -#define Z_DEPTH_BORDER 1.0 -#define Z_DEPTH_IMAGE 0.75 - -in vec2 uv_screen; -in vec2 uv_image; - -out vec4 fragColor; - -bool is_border(vec2 uv) -{ - return (uv.x < 0.0 || uv.y < 0.0 || uv.x > maxUv.x || uv.y > maxUv.y); -} - -void main() -{ - ivec2 uvs_clamped = ivec2(uv_screen); - vec4 tex_color = texelFetch(imageTexture, uvs_clamped, 0); - - bool border = is_border(uv_image); - if (!border) { - if ((drawFlags & IMAGE_DRAW_FLAG_APPLY_ALPHA) != 0) { - if (!imgPremultiplied) { - tex_color.rgb *= tex_color.a; - } - } - if ((drawFlags & IMAGE_DRAW_FLAG_DEPTH) != 0) { - tex_color = smoothstep(FAR_DISTANCE, NEAR_DISTANCE, tex_color); - } - - if ((drawFlags & IMAGE_DRAW_FLAG_SHUFFLING) != 0) { - tex_color = color * dot(tex_color, shuffle); - } - if ((drawFlags & IMAGE_DRAW_FLAG_SHOW_ALPHA) == 0) { - tex_color.a = 1.0; - } - } - fragColor = tex_color; - gl_FragDepth = border ? Z_DEPTH_BORDER : Z_DEPTH_IMAGE; -} diff --git a/source/blender/draw/engines/image/shaders/engine_image_vert.glsl b/source/blender/draw/engines/image/shaders/engine_image_vert.glsl deleted file mode 100644 index 0c106f48f4a..00000000000 --- a/source/blender/draw/engines/image/shaders/engine_image_vert.glsl +++ /dev/null @@ -1,19 +0,0 @@ -#pragma BLENDER_REQUIRE(common_view_lib.glsl) - -in vec2 pos; -in vec2 uv; - -/* Normalized screen space uv coordinates. */ -out vec2 uv_screen; -out vec2 uv_image; - -void main() -{ - vec3 image_pos = vec3(pos, 0.0); - uv_screen = image_pos.xy; - uv_image = uv; - - vec3 world_pos = point_object_to_world(image_pos); - vec4 position = point_world_to_ndc(world_pos); - gl_Position = position; -} diff --git a/source/blender/draw/engines/image/shaders/image_engine_frag.glsl b/source/blender/draw/engines/image/shaders/image_engine_frag.glsl new file mode 100644 index 00000000000..bcdc8445b26 --- /dev/null +++ b/source/blender/draw/engines/image/shaders/image_engine_frag.glsl @@ -0,0 +1,45 @@ +#pragma BLENDER_REQUIRE(common_colormanagement_lib.glsl) + +/* Keep in sync with image_engine.c */ +#define IMAGE_DRAW_FLAG_SHOW_ALPHA (1 << 0) +#define IMAGE_DRAW_FLAG_APPLY_ALPHA (1 << 1) +#define IMAGE_DRAW_FLAG_SHUFFLING (1 << 2) +#define IMAGE_DRAW_FLAG_DEPTH (1 << 3) + +#define Z_DEPTH_BORDER 1.0 +#define Z_DEPTH_IMAGE 0.75 + +#define FAR_DISTANCE farNearDistances.x +#define NEAR_DISTANCE farNearDistances.y + +bool is_border(vec2 uv) +{ + return (uv.x < 0.0 || uv.y < 0.0 || uv.x > maxUv.x || uv.y > maxUv.y); +} + +void main() +{ + ivec2 uvs_clamped = ivec2(uv_screen); + vec4 tex_color = texelFetch(imageTexture, uvs_clamped, 0); + + bool border = is_border(uv_image); + if (!border) { + if ((drawFlags & IMAGE_DRAW_FLAG_APPLY_ALPHA) != 0) { + if (!imgPremultiplied) { + tex_color.rgb *= tex_color.a; + } + } + if ((drawFlags & IMAGE_DRAW_FLAG_DEPTH) != 0) { + tex_color = smoothstep(FAR_DISTANCE, NEAR_DISTANCE, tex_color); + } + + if ((drawFlags & IMAGE_DRAW_FLAG_SHUFFLING) != 0) { + tex_color = col * dot(tex_color, shuffle); + } + if ((drawFlags & IMAGE_DRAW_FLAG_SHOW_ALPHA) == 0) { + tex_color.a = 1.0; + } + } + fragColor = tex_color; + gl_FragDepth = border ? Z_DEPTH_BORDER : Z_DEPTH_IMAGE; +} diff --git a/source/blender/draw/engines/image/shaders/image_engine_vert.glsl b/source/blender/draw/engines/image/shaders/image_engine_vert.glsl new file mode 100644 index 00000000000..deefab655d2 --- /dev/null +++ b/source/blender/draw/engines/image/shaders/image_engine_vert.glsl @@ -0,0 +1,12 @@ +#pragma BLENDER_REQUIRE(common_view_lib.glsl) + +void main() +{ + vec3 image_pos = vec3(pos, 0.0); + uv_screen = image_pos.xy; + uv_image = uv; + + vec3 world_pos = point_object_to_world(image_pos); + vec4 position = point_world_to_ndc(world_pos); + gl_Position = position; +} diff --git a/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh b/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh new file mode 100644 index 00000000000..e691abfadcf --- /dev/null +++ b/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh @@ -0,0 +1,22 @@ +#include "gpu_shader_create_info.hh" + +GPU_SHADER_INTERFACE_INFO(image_engine_iface, "") + .smooth(Type::VEC2, "uv_screen") + .smooth(Type::VEC2, "uv_image"); + +GPU_SHADER_CREATE_INFO(image_engine_shader) + .vertex_in(0, Type::VEC2, "pos") + .vertex_in(1, Type::VEC2, "uv") + .vertex_out(image_engine_iface) + .fragment_out(0, Type::VEC4, "fragColor") + .push_constant(Type::VEC4, "shuffle") + .push_constant(Type::VEC4, "col") + .push_constant(Type::VEC2, "maxUv") + .push_constant(Type::VEC2, "farNearDistances") + .push_constant(Type::INT, "drawFlags") + .push_constant(Type::BOOL, "imgPremultiplied") + .sampler(0, ImageType::FLOAT_2D, "imageTexture") + .vertex_source("image_engine_vert.glsl") + .fragment_source("image_engine_frag.glsl") + .additional_info("draw_modelmat") + .do_static_compilation(true); \ No newline at end of file -- cgit v1.2.3