From 6d346928312e80bf0a2e5564fd497e83c0a11d5c Mon Sep 17 00:00:00 2001 From: Vanessa Karolek <vaka1997@uni-koblenz.de> Date: Tue, 20 Jul 2021 16:58:02 +0200 Subject: [PATCH] [#94] use rendered texture in shaders --- projects/saf_r/shaders/shader.frag | 10 +++++-- projects/saf_r/shaders/shader.vert | 10 +++++-- projects/saf_r/src/main.cpp | 47 +++++++++++++++++++++--------- 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/projects/saf_r/shaders/shader.frag b/projects/saf_r/shaders/shader.frag index 080678be..2403928a 100644 --- a/projects/saf_r/shaders/shader.frag +++ b/projects/saf_r/shaders/shader.frag @@ -2,8 +2,14 @@ #extension GL_ARB_separate_shader_objects : enable layout(location = 0) in vec3 fragColor; -layout(location = 0) out vec4 outColor; +layout(location = 1) in vec2 texCoord; + +layout(location = 0) out vec3 outColor; + +layout(set=0, binding=0) uniform texture2D tex; +layout(set=0, binding=1) uniform sampler textureSampler; void main() { - outColor = vec4(fragColor, 1.0); + outColor = fragColor; + outColor = texture(sampler2D(tex, textureSampler), texCoord).rgb; } \ No newline at end of file diff --git a/projects/saf_r/shaders/shader.vert b/projects/saf_r/shaders/shader.vert index 3bcc38fb..1faa9080 100644 --- a/projects/saf_r/shaders/shader.vert +++ b/projects/saf_r/shaders/shader.vert @@ -2,6 +2,7 @@ #extension GL_ARB_separate_shader_objects : enable layout(location = 0) out vec3 fragColor; +layout(location = 1) out vec2 texCoord; layout( push_constant ) uniform constants{ mat4 mvp; @@ -11,7 +12,7 @@ void main() { vec3 positions[3] = { vec3(-1, -1, -1), vec3( 3, -1, -1), - vec3(-1, 3, -1), + vec3(-1, 3, -1) }; vec3 colors[3] = { @@ -20,6 +21,11 @@ void main() { vec3(0, 0, 1) }; - gl_Position = mvp * vec4(positions[gl_VertexIndex], 1.0); + vec4 position = mvp * vec4(positions[gl_VertexIndex], 1.0); + gl_Position = position; + + texCoord.x = (position.x + 1.0) * 0.5; + texCoord.y = (position.y + 1.0) * 0.5; + fragColor = colors[gl_VertexIndex]; } \ No newline at end of file diff --git a/projects/saf_r/src/main.cpp b/projects/saf_r/src/main.cpp index 97de405f..2116af98 100644 --- a/projects/saf_r/src/main.cpp +++ b/projects/saf_r/src/main.cpp @@ -153,12 +153,43 @@ int main(int argc, const char** argv) { { "VK_KHR_swapchain" } ); + vkcv::ShaderProgram triangleShaderProgram; + vkcv::shader::GLSLCompiler compiler; + + compiler.compile(vkcv::ShaderStage::VERTEX, std::filesystem::path("shaders/shader.vert"), + [&triangleShaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { + triangleShaderProgram.addShader(shaderStage, path); + }); + + compiler.compile(vkcv::ShaderStage::FRAGMENT, std::filesystem::path("shaders/shader.frag"), + [&triangleShaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { + triangleShaderProgram.addShader(shaderStage, path); + }); + + uint32_t setID = 0; + std::vector<vkcv::DescriptorBinding> descriptorBindings = { triangleShaderProgram.getReflectedDescriptors()[setID] }; + vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorBindings); + vkcv::asset::TextureData texData = vkcv::asset::loadTexture("textures/texture.png"); vkcv::Image texture = core.createImage(vk::Format::eR8G8B8A8Srgb, 800, 600); texture.fill( texData.data.data()); texture.generateMipChainImmediate(); texture.switchLayout(vk::ImageLayout::eShaderReadOnlyOptimal); + vkcv::SamplerHandle sampler = core.createSampler( + vkcv::SamplerFilterType::LINEAR, + vkcv::SamplerFilterType::LINEAR, + vkcv::SamplerMipmapMode::LINEAR, + vkcv::SamplerAddressMode::REPEAT + ); + + + vkcv::DescriptorWrites setWrites; + setWrites.sampledImageWrites = { vkcv::SampledImageDescriptorWrite(0, texture.getHandle()) }; + setWrites.samplerWrites = { vkcv::SamplerDescriptorWrite(1, sampler) }; + + core.writeDescriptorSet(descriptorSet, setWrites); + const auto& context = core.getContext(); auto triangleIndexBuffer = core.createBuffer<uint16_t>(vkcv::BufferType::INDEX, 3, vkcv::BufferMemoryType::DEVICE_LOCAL); @@ -180,18 +211,7 @@ int main(int argc, const char** argv) { return EXIT_FAILURE; } - vkcv::ShaderProgram triangleShaderProgram; - vkcv::shader::GLSLCompiler compiler; - compiler.compile(vkcv::ShaderStage::VERTEX, std::filesystem::path("shaders/shader.vert"), - [&triangleShaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { - triangleShaderProgram.addShader(shaderStage, path); - }); - - compiler.compile(vkcv::ShaderStage::FRAGMENT, std::filesystem::path("shaders/shader.frag"), - [&triangleShaderProgram](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) { - triangleShaderProgram.addShader(shaderStage, path); - }); const vkcv::PipelineConfig trianglePipelineDefinition { triangleShaderProgram, @@ -199,7 +219,7 @@ int main(int argc, const char** argv) { (uint32_t)windowHeight, trianglePass, {}, - {}, + { core.getDescriptorSet(descriptorSet).layout }, false }; @@ -214,7 +234,8 @@ int main(int argc, const char** argv) { auto start = std::chrono::system_clock::now(); const vkcv::Mesh renderMesh({}, triangleIndexBuffer.getVulkanHandle(), 3); - vkcv::DrawcallInfo drawcall(renderMesh, {},1); + vkcv::DescriptorSetUsage descriptorUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle); + vkcv::DrawcallInfo drawcall(renderMesh, { descriptorUsage },1); const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle(); -- GitLab