diff --git a/blur-gaussian/blur-gaussian.cpp b/blur-gaussian/blur-gaussian.cpp index 61a30b5..2f9cbae 100644 --- a/blur-gaussian/blur-gaussian.cpp +++ b/blur-gaussian/blur-gaussian.cpp @@ -102,7 +102,7 @@ class GaussianBlur : public GraphicsApp // 1. Horizontal pass horzDescriptor.layout = std::shared_ptr(new magma::DescriptorSetLayout(device, { - FragmentStageBinding(0, CombinedImageSampler(1)), + VertexFragmentStageBinding(0, CombinedImageSampler(1)), FragmentStageBinding(1, StorageBuffer(1)), })); horzDescriptor.set = descriptorPool->allocateDescriptorSet(horzDescriptor.layout); @@ -111,7 +111,7 @@ class GaussianBlur : public GraphicsApp // 2. Vertical pass vertDescriptor.layout = std::shared_ptr(new magma::DescriptorSetLayout(device, { - FragmentStageBinding(0, CombinedImageSampler(1)), + VertexFragmentStageBinding(0, CombinedImageSampler(1)), FragmentStageBinding(1, StorageBuffer(1)), })); vertDescriptor.set = descriptorPool->allocateDescriptorSet(vertDescriptor.layout); @@ -127,11 +127,11 @@ class GaussianBlur : public GraphicsApp Constants constants; constants.horzPass = VK_TRUE; auto specialization = std::make_shared(constants, entry); - horzPassPipeline = createFullscreenPipeline("quad.o", "blur.o", std::move(specialization), horzDescriptor.layout, tempFramebuffer); + horzPassPipeline = createFullscreenPipeline("quadoff.o", "blur.o", std::move(specialization), horzDescriptor.layout, tempFramebuffer); // 2. Vertical pass constants.horzPass = VK_FALSE; specialization = std::make_shared(constants, entry); - vertPassPipeline = createFullscreenPipeline("quad.o", "blur.o", std::move(specialization), vertDescriptor.layout, framebuffers[0]); + vertPassPipeline = createFullscreenPipeline("quadoff.o", "blur.o", std::move(specialization), vertDescriptor.layout, framebuffers[0]); } void renderScene(uint32_t bufferIndex) @@ -150,8 +150,8 @@ class GaussianBlur : public GraphicsApp { if (blurImage) cmdBuffer->beginRenderPass(inputFramebuffer->getRenderPass(), inputFramebuffer->getFramebuffer()); - else - cmdBuffer->beginRenderPass(renderPass, framebuffers[bufferIndex]); // Draw to swapchain + else // Draw to swapchain + cmdBuffer->beginRenderPass(renderPass, framebuffers[bufferIndex]); { cmdBuffer->bindPipeline(checkerboardPipeline); cmdBuffer->draw(4, 0); diff --git a/blur-gaussian/blur-gaussian.vcxproj b/blur-gaussian/blur-gaussian.vcxproj index cdb0727..3189d83 100644 --- a/blur-gaussian/blur-gaussian.vcxproj +++ b/blur-gaussian/blur-gaussian.vcxproj @@ -33,7 +33,7 @@ $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o %(Filename).o - + Document $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o %(Filename).o @@ -58,6 +58,19 @@ %(Filename).o + + + Document + $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o + $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o + $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o + $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o + %(Filename).o + %(Filename).o + %(Filename).o + %(Filename).o + + 15.0 {709912CF-51E5-4AD2-85AE-A7D70B4C6495} diff --git a/blur-gaussian/blur-gaussian.vcxproj.filters b/blur-gaussian/blur-gaussian.vcxproj.filters index b9695d0..9d0b519 100644 --- a/blur-gaussian/blur-gaussian.vcxproj.filters +++ b/blur-gaussian/blur-gaussian.vcxproj.filters @@ -24,6 +24,9 @@ Resource Files + + Resource Files + diff --git a/blur-gaussian/shaders/blur.frag b/blur-gaussian/shaders/blur.frag index 98509e2..6636d50 100644 --- a/blur-gaussian/shaders/blur.frag +++ b/blur-gaussian/shaders/blur.frag @@ -2,37 +2,22 @@ #define N 15 // odd -layout(constant_id = 0) const bool c_horzPass = true; - layout(binding = 0) uniform sampler2D img; layout(binding = 1) buffer Weights { float weights[N + 1]; // + norm factor }; -layout(location = 0) in vec2 texCoord; +layout(location = 0) in vec4 texCoord; // u, v, du, dv layout(location = 0) out vec3 oColor; void main() { - const vec2 tx = 1./textureSize(img, 0); - const int n = N >> 1; - vec2 uv = texCoord; - vec2 duv; - - if (c_horzPass) - { - uv.x -= n * tx.x; - duv = vec2(tx.x, 0); - } - else - { - uv.y -= n * tx.y; - duv = vec2(0, tx.y); - } + vec2 uv = texCoord.xy; + vec2 duv = texCoord.zw; // Gaussian filter oColor = vec3(0.); for (int i = 0; i < N; ++i, uv += duv) - oColor += texture(img, uv).rgb * weights[i]; + oColor += textureLod(img, uv, 0).rgb * weights[i]; oColor.rgb *= weights[N]; // normalize } diff --git a/blur-gaussian/shaders/quadoff.vert b/blur-gaussian/shaders/quadoff.vert new file mode 100644 index 0000000..fb89b5e --- /dev/null +++ b/blur-gaussian/shaders/quadoff.vert @@ -0,0 +1,38 @@ +#version 450 + +#define N 15 // odd + +layout(constant_id = 0) const bool c_horzPass = true; + +layout(binding = 0) uniform sampler2D img; + +layout(location = 0) out vec4 oTexCoord; // u, v, du, dv +out gl_PerVertex { + vec4 gl_Position; +}; + +void main() +{ + vec2 quad[4] = vec2[]( + // top + vec2(-1.,-1.), // left + vec2( 1.,-1.), // right + // bottom + vec2(-1., 1.), // left + vec2( 1., 1.) // right + ); + gl_Position = vec4(quad[gl_VertexIndex], 0., 1.); + oTexCoord.xy = gl_Position.xy * .5 + .5; + oTexCoord.zw = 1./textureSize(img, 0); + const int n = N >> 1; + if (c_horzPass) + { + oTexCoord.x -= n * oTexCoord.z; + oTexCoord.w = 0.; // dv + } + else + { + oTexCoord.y -= n * oTexCoord.w; + oTexCoord.z = 0.; // du + } +} diff --git a/blur-ping-pong/blur-ping-pong.cpp b/blur-ping-pong/blur-ping-pong.cpp index 0d46dac..2677ed1 100644 --- a/blur-ping-pong/blur-ping-pong.cpp +++ b/blur-ping-pong/blur-ping-pong.cpp @@ -61,7 +61,7 @@ class PingPongBlur : public GraphicsApp const Constants constant = {MAGMA_BOOLEAN(ping)}; const magma::SpecializationEntry entry(0, &Constants::ping); auto specialization = std::make_shared(constant, entry); - pass.pipeline = createFullscreenPipeline("quad.o", "bilerp.o", std::move(specialization), std::move(layout), pass.framebuffer); + pass.pipeline = createFullscreenPipeline("quadoff.o", "bilerp.o", std::move(specialization), std::move(layout), pass.framebuffer); return pass; } diff --git a/blur-ping-pong/blur-ping-pong.vcxproj b/blur-ping-pong/blur-ping-pong.vcxproj index 85d6836..9dd6dee 100644 --- a/blur-ping-pong/blur-ping-pong.vcxproj +++ b/blur-ping-pong/blur-ping-pong.vcxproj @@ -56,6 +56,19 @@ %(Filename).o + + + Document + $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o + $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o + $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o + $(VK_SDK_PATH)\Bin32\glslangValidator.exe -V %(FullPath) -I..\framework\shaders -o %(Filename).o + %(Filename).o + %(Filename).o + %(Filename).o + %(Filename).o + + 15.0 {1C51CC8A-6183-43C7-A231-9066FA95587A} diff --git a/blur-ping-pong/blur-ping-pong.vcxproj.filters b/blur-ping-pong/blur-ping-pong.vcxproj.filters index da79a77..077a0d8 100644 --- a/blur-ping-pong/blur-ping-pong.vcxproj.filters +++ b/blur-ping-pong/blur-ping-pong.vcxproj.filters @@ -28,6 +28,9 @@ Resource Files + + + Resource Files \ No newline at end of file diff --git a/blur-ping-pong/shaders/quad.vert b/blur-ping-pong/shaders/quad.vert index 021e3d3..540ed1f 100644 --- a/blur-ping-pong/shaders/quad.vert +++ b/blur-ping-pong/shaders/quad.vert @@ -1,9 +1,5 @@ #version 450 -layout(constant_id = 0) const bool c_ping = true; - -layout(binding = 0) uniform sampler2D img; - layout(location = 0) out vec2 oTexCoord; out gl_PerVertex { vec4 gl_Position; @@ -19,8 +15,6 @@ void main() vec2(-1., 1.), // left vec2( 1., 1.) // right ); - const vec2 off = 0.5/textureSize(img, 0); // half texel offset gl_Position = vec4(quad[gl_VertexIndex], 0., 1.); oTexCoord = gl_Position.xy * .5 + .5; - oTexCoord += c_ping ? off : -off; } diff --git a/blur-ping-pong/shaders/quadoff.vert b/blur-ping-pong/shaders/quadoff.vert new file mode 100644 index 0000000..021e3d3 --- /dev/null +++ b/blur-ping-pong/shaders/quadoff.vert @@ -0,0 +1,26 @@ +#version 450 + +layout(constant_id = 0) const bool c_ping = true; + +layout(binding = 0) uniform sampler2D img; + +layout(location = 0) out vec2 oTexCoord; +out gl_PerVertex { + vec4 gl_Position; +}; + +void main() +{ + vec2 quad[4] = vec2[]( + // top + vec2(-1.,-1.), // left + vec2( 1.,-1.), // right + // bottom + vec2(-1., 1.), // left + vec2( 1., 1.) // right + ); + const vec2 off = 0.5/textureSize(img, 0); // half texel offset + gl_Position = vec4(quad[gl_VertexIndex], 0., 1.); + oTexCoord = gl_Position.xy * .5 + .5; + oTexCoord += c_ping ? off : -off; +} diff --git a/framework/graphicsApp.cpp b/framework/graphicsApp.cpp index a93874b..fbc3a9d 100644 --- a/framework/graphicsApp.cpp +++ b/framework/graphicsApp.cpp @@ -203,7 +203,7 @@ std::shared_ptr GraphicsApp::createCommonSpecializedPip std::move(setLayout)); return std::make_shared(device, std::vector{ - loadShaderStage(vertexShaderFile), + loadShaderStage(vertexShaderFile, specialization), loadShaderStage(fragmentShaderFile, std::move(specialization)) }, vertexInputState, magma::renderstates::triangleList, @@ -279,7 +279,7 @@ std::shared_ptr GraphicsApp::createFullscreenPipeline(c pipelineLayout = std::make_shared(std::move(setLayout)); return std::make_shared(device, std::vector{ - loadShaderStage(vertexShaderFile, std::move(specialization)), + loadShaderStage(vertexShaderFile, specialization), loadShaderStage(fragmentShaderFile, std::move(specialization)) }, magma::renderstates::nullVertexInput, magma::renderstates::triangleStrip, @@ -305,7 +305,7 @@ std::shared_ptr GraphicsApp::createFullscreenPipeline(c pipelineLayout = std::make_shared(std::move(setLayout)); return std::make_shared(device, std::vector{ - loadShaderStage(vertexShaderFile), + loadShaderStage(vertexShaderFile, specialization), loadShaderStage(fragmentShaderFile, std::move(specialization)) }, magma::renderstates::nullVertexInput, magma::renderstates::triangleStrip,