From 9493dafe44fedbe1ddabcaffcf9d7c2745d2fd45 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 1 Jun 2022 12:19:40 +0200 Subject: [PATCH] vulkan: update example shaders --- spa/plugins/vulkan/shaders/filter-color.comp | 39 ++++++++++++++++ spa/plugins/vulkan/shaders/filter.comp | 44 +++++++++++++++++++ spa/plugins/vulkan/shaders/filter.spv | Bin 0 -> 4884 bytes spa/plugins/vulkan/shaders/main.spv | Bin 10208 -> 9980 bytes 4 files changed, 83 insertions(+) create mode 100644 spa/plugins/vulkan/shaders/filter-color.comp create mode 100644 spa/plugins/vulkan/shaders/filter.comp create mode 100644 spa/plugins/vulkan/shaders/filter.spv diff --git a/spa/plugins/vulkan/shaders/filter-color.comp b/spa/plugins/vulkan/shaders/filter-color.comp new file mode 100644 index 000000000..e08b715c5 --- /dev/null +++ b/spa/plugins/vulkan/shaders/filter-color.comp @@ -0,0 +1,39 @@ +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 p = fragCoord.xy/iResolution.xy; + + vec4 col = texture(iChannel0, p); + + + //Desaturate + if(p.x<.25) + { + col = vec4( (col.r+col.g+col.b)/3. ); + } + //Invert + else if (p.x<.5) + { + col = vec4(1.) - texture(iChannel0, p); + } + //Chromatic aberration + else if (p.x<.75) + { + vec2 offset = vec2(.01,.0); + col.r = texture(iChannel0, p+offset.xy).r; + col.g = texture(iChannel0, p ).g; + col.b = texture(iChannel0, p+offset.yx).b; + } + //Color switching + else + { + col.rgb = texture(iChannel0, p).brg; + } + + + //Line + if( mod(abs(p.x+.5/iResolution.y),.25)<0.5/iResolution.y ) + col = vec4(1.); + + + fragColor = col; +} diff --git a/spa/plugins/vulkan/shaders/filter.comp b/spa/plugins/vulkan/shaders/filter.comp new file mode 100644 index 000000000..f1ca48670 --- /dev/null +++ b/spa/plugins/vulkan/shaders/filter.comp @@ -0,0 +1,44 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +#define WORKGROUP_SIZE 32 +layout (local_size_x = WORKGROUP_SIZE, local_size_y = WORKGROUP_SIZE, local_size_z = 1 ) in; + +layout(rgba32f, set = 0, binding = 0) uniform image2D resultImage; +layout(set = 0, binding = 1) uniform sampler2D iChannel0; + +layout( push_constant ) uniform Constants { + float time; + int frame; + int width; + int height; +} PushConstant; + +float iTime; +int iFrame; +vec3 iResolution; +vec4 iMouse; + +void mainImage( out vec4 fragColor, in vec2 fragCoord ); + +void main() +{ + iTime = PushConstant.time; + iFrame = PushConstant.frame; + iResolution = vec3(float(PushConstant.width), float(PushConstant.height), 0.0); + iMouse = vec4(0.0, 0.0, 0.0, 0.0); + vec2 coord = vec2(float(gl_GlobalInvocationID.x), + iResolution.y - float(gl_GlobalInvocationID.y)); + vec4 outColor; + + if(coord.x >= iResolution.x || coord.y >= iResolution.y) + return; + + mainImage(outColor, coord); + + imageStore(resultImage, ivec2(gl_GlobalInvocationID.xy), outColor); +} + +//#include "smearcam.comp" +#include "filter-color.comp" +//#include "filter-ripple.comp" diff --git a/spa/plugins/vulkan/shaders/filter.spv b/spa/plugins/vulkan/shaders/filter.spv new file mode 100644 index 0000000000000000000000000000000000000000..5bfd24593dd343b062b9282e9facfacd2ad25bb2 GIT binary patch literal 4884 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 MC#c*9$-(9W01c6gq5uE@ literal 10208 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