Commit: 5ca61242078b2a66447a97de16191a81698f2efd Author: Omar Emara Date: Sat Nov 13 14:18:36 2021 +0200 Branches: viewport-compositor https://developer.blender.org/rB5ca61242078b2a66447a97de16191a81698f2efd
Viewport Compositor: Port Separate/Combine nodes This patch ports the Separate/Combine nodes to the viewport compositor. The shader is a straightforward port of the compositor code. =================================================================== M source/blender/gpu/CMakeLists.txt M source/blender/gpu/intern/gpu_material_library.c M source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl A source/blender/gpu/shaders/composite/gpu_shader_composite_separate_combine.glsl M source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc M source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc M source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.cc M source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.cc =================================================================== diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 157ac93cfc6..c4348698587 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -294,6 +294,7 @@ data_to_c_simple(shaders/composite/gpu_shader_composite_hue_saturation_value.gls data_to_c_simple(shaders/composite/gpu_shader_composite_image.glsl SRC) data_to_c_simple(shaders/composite/gpu_shader_composite_invert.glsl SRC) data_to_c_simple(shaders/composite/gpu_shader_composite_posterize.glsl SRC) +data_to_c_simple(shaders/composite/gpu_shader_composite_separate_combine.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_add_shader.glsl SRC) data_to_c_simple(shaders/material/gpu_shader_material_ambient_occlusion.glsl SRC) diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c index fb3acc73eed..bc7c23f4234 100644 --- a/source/blender/gpu/intern/gpu_material_library.c +++ b/source/blender/gpu/intern/gpu_material_library.c @@ -60,6 +60,7 @@ extern char datatoc_gpu_shader_composite_hue_saturation_value_glsl[]; extern char datatoc_gpu_shader_composite_image_glsl[]; extern char datatoc_gpu_shader_composite_invert_glsl[]; extern char datatoc_gpu_shader_composite_posterize_glsl[]; +extern char datatoc_gpu_shader_composite_separate_combine_glsl[]; extern char datatoc_gpu_shader_material_add_shader_glsl[]; extern char datatoc_gpu_shader_material_ambient_occlusion_glsl[]; @@ -241,6 +242,11 @@ static GPUMaterialLibrary gpu_shader_composite_posterize_library = { .dependencies = {NULL}, }; +static GPUMaterialLibrary gpu_shader_composite_separate_combined_library = { + .code = datatoc_gpu_shader_composite_separate_combine_glsl, + .dependencies = {&gpu_shader_common_color_util_library, NULL}, +}; + static GPUMaterialLibrary gpu_shader_material_noise_library = { .code = datatoc_gpu_shader_material_noise_glsl, .dependencies = {&gpu_shader_common_hash_library, NULL}, @@ -758,6 +764,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = { &gpu_shader_composite_image_library, &gpu_shader_composite_invert_library, &gpu_shader_composite_posterize_library, + &gpu_shader_composite_separate_combined_library, NULL}; /* GLSL code parsing for finding function definitions. diff --git a/source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl b/source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl index c2081482042..eee79fa2e40 100644 --- a/source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl +++ b/source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl @@ -90,6 +90,84 @@ void hsv_to_rgb(vec4 hsv, out vec4 outcol) outcol = vec4(rgb, hsv.w); } +/* ** YCCA to RGBA ** */ + +void ycca_to_rgba_itu_601(vec4 ycca, out vec4 color) +{ + ycca.xyz *= 255.0; + ycca.xyz -= vec3(16.0, 128.0, 128.0); + color.rgb = mat3(vec3(1.164), 0.0, -0.392, 2.017, 1.596, -0.813, 0.0) * ycca.xyz; + color.rgb /= 255.0; + color.a = ycca.a; +} + +void ycca_to_rgba_itu_709(vec4 ycca, out vec4 color) +{ + ycca.xyz *= 255.0; + ycca.xyz -= vec3(16.0, 128.0, 128.0); + color.rgb = mat3(vec3(1.164), 0.0, -0.213, 2.115, 1.793, -0.534, 0.0) * ycca.xyz; + color.rgb /= 255.0; + color.a = ycca.a; +} + +void ycca_to_rgba_jpeg(vec4 ycca, out vec4 color) +{ + ycca.xyz *= 255.0; + color.rgb = mat3(vec3(1.0), 0.0, -0.34414, 1.772, 1.402, -0.71414, 0.0) * ycca.xyz; + color.rgb += vec3(-179.456, 135.45984, -226.816); + color.rgb /= 255.0; + color.a = ycca.a; +} + +/* ** RGBA to YCCA ** */ + +void rgba_to_ycca_itu_601(vec4 rgba, out vec4 ycca) +{ + rgba.rgb *= 255.0; + ycca.xyz = mat3(0.257, -0.148, 0.439, 0.504, -0.291, -0.368, 0.098, 0.439, -0.071) * rgba.rgb; + ycca.xyz += vec3(16.0, 128.0, 128.0); + ycca.xyz /= 255.0; + ycca.a = rgba.a; +} + +void rgba_to_ycca_itu_709(vec4 rgba, out vec4 ycca) +{ + rgba.rgb *= 255.0; + ycca.xyz = mat3(0.183, -0.101, 0.439, 0.614, -0.338, -0.399, 0.062, 0.439, -0.040) * rgba.rgb; + ycca.xyz += vec3(16.0, 128.0, 128.0); + ycca.xyz /= 255.0; + ycca.a = rgba.a; +} + +void rgba_to_ycca_jpeg(vec4 rgba, out vec4 ycca) +{ + rgba.rgb *= 255.0; + ycca.xyz = mat3(0.299, -0.16874, 0.5, 0.587, -0.33126, -0.41869, 0.114, 0.5, -0.08131) * + rgba.rgb; + ycca.xyz += vec3(0.0, 128.0, 128.0); + ycca.xyz /= 255.0; + ycca.a = rgba.a; +} + +/* ** YUVA to RGBA ** */ + +void yuva_to_rgba_itu_709(vec4 yuva, out vec4 color) +{ + color.rgb = mat3(vec3(1.0), 0.0, -0.21482, 2.12798, 1.28033, -0.38059, 0.0) * yuva.xyz; + color.a = yuva.a; +} + +/* ** RGBA to YUVA ** */ + +void rgba_to_yuva_itu_709(vec4 rgba, out vec4 yuva) +{ + yuva.xyz = mat3(0.2126, -0.09991, 0.615, 0.7152, -0.33609, -0.55861, 0.0722, 0.436, -0.05639) * + rgba.rgb; + yuva.a = rgba.a; +} + +/* ** Alpha Handling ** */ + void color_alpha_clear(vec4 color, out vec4 result) { result = vec4(color.rgb, 1.0); diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_separate_combine.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_separate_combine.glsl new file mode 100644 index 00000000000..5a14adf841b --- /dev/null +++ b/source/blender/gpu/shaders/composite/gpu_shader_composite_separate_combine.glsl @@ -0,0 +1,99 @@ +/* ** Combine/Separate RGBA ** */ + +void node_composite_combine_rgba(float r, float g, float b, float a, out vec4 color) +{ + color = vec4(r, g, b, a); +} + +void node_composite_separate_rgba(vec4 color, out float r, out float g, out float b, out float a) +{ + r = color.r; + g = color.g; + b = color.b; + a = color.a; +} + +/* ** Combine/Separate HSVA ** */ + +void node_composite_combine_hsva(float h, float s, float v, float a, out vec4 color) +{ + hsv_to_rgb(vec4(h, s, v, a), color); +} + +void node_composite_separate_hsva(vec4 color, out float h, out float s, out float v, out float a) +{ + vec4 hsva; + rgb_to_hsv(color, hsva); + h = hsva.x; + s = hsva.y; + v = hsva.z; + a = hsva.a; +} + +/* ** Combine/Separate YCCA ** */ + +void node_composite_combine_ycca_itu_601(float y, float cb, float cr, float a, out vec4 color) +{ + ycca_to_rgba_itu_601(vec4(y, cb, cr, a), color); +} + +void node_composite_combine_ycca_itu_709(float y, float cb, float cr, float a, out vec4 color) +{ + ycca_to_rgba_itu_709(vec4(y, cb, cr, a), color); +} + +void node_composite_combine_ycca_jpeg(float y, float cb, float cr, float a, out vec4 color) +{ + ycca_to_rgba_jpeg(vec4(y, cb, cr, a), color); +} + +void node_composite_separate_ycca_itu_601( + vec4 color, out float y, out float cb, out float cr, out float a) +{ + vec4 ycca; + rgba_to_ycca_itu_601(color, ycca); + y = ycca.x; + cb = ycca.y; + cr = ycca.z; + a = ycca.a; +} + +void node_composite_separate_ycca_itu_709( + vec4 color, out float y, out float cb, out float cr, out float a) +{ + vec4 ycca; + rgba_to_ycca_itu_709(color, ycca); + y = ycca.x; + cb = ycca.y; + cr = ycca.z; + a = ycca.a; +} + +void node_composite_separate_ycca_jpeg( + vec4 color, out float y, out float cb, out float cr, out float a) +{ + vec4 ycca; + rgba_to_ycca_jpeg(color, ycca); + y = ycca.x; + cb = ycca.y; + cr = ycca.z; + a = ycca.a; +} + +/* ** Combine/Separate YUVA ** */ + +void node_composite_combine_yuva_itu_709(float y, float u, float v, float a, out vec4 color) +{ + yuva_to_rgba_itu_709(vec4(y, u, v, a), color); +} + +void node_composite_separate_yuva_itu_709( + vec4 color, out float y, out float u, out float v, out float a) +{ + vec4 yuva; + rgba_to_yuva_itu_709(color, yuva); + y = yuva.x; + u = yuva.y; + v = yuva.z; + a = yuva.a; +} diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc index 17b1ab9ac59..65080c2c5b0 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc @@ -36,12 +36,22 @@ static bNodeSocketTemplate cmp_node_sephsva_out[] = { {-1, ""}, }; +static int node_composite_gpu_sephsva(GPUMaterial *mat, + bNode *node, + bNodeExecData *UNUSED(execdata), + GPUNodeStack *in, + GPUNodeStack *out) +{ + return GPU_stack_link(mat, node, "node_composite_separate_hsva", in, out); +} + void register_node_type_cmp_sephsva(void) { static bNodeType ntype; cmp_node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTER, 0); node_type_socket_templates(&ntype, cmp_node_sephsva_in, cmp_node_sephsva_out); + node_type_gpu(&ntype, node_composite_gpu_sephsva); nodeRegisterType(&ntype); } @@ -59,12 +69,22 @@ static bNodeSocketTemplate cmp_node_combhsva_out[] = { {-1, ""}, }; +static int node_composite_gpu_combhsva(GPUMaterial *mat, + bNode *node, + bNodeExecData *UNUSED(execdata), + GPUNodeStack *in, + GPUNodeStack *out) +{ + return GPU_stack_link(mat, node, "node_composite_combine_hsva", in, out); +} + void register_node_type_cmp_combhsva(void) { static bNodeType ntype; cmp_node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTER, 0); node_type_socket_templates(&ntype, cmp_node_combhsva_in, cmp_node_combhsva_out); + node_type_gpu(&ntype, node_composite_gpu_combhsva); nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc index d3a021ed7ba..d4ee8fe3b00 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc @@ -36,12 +36,22 @@ static bNodeSocketTemplate cmp_node_seprgba_out[] = { {-1, ""}, }; +static int node_composite_gpu_seprgba(GPUMaterial *mat, + bNode *node, + bNodeExecData *UNUSED(execdata), + @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs