From 75796f48e109988510f2561af89574a5017a1edf Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sat, 22 Nov 2025 12:50:35 +0100 Subject: [PATCH 1/3] Use designated initializers for color blend attachment state Refs #132 --- attachments/27_depth_buffering.cpp | 8 +++----- attachments/28_model_loading.cpp | 8 +++----- attachments/29_mipmapping.cpp | 8 +++----- attachments/30_multisampling.cpp | 8 +++----- attachments/32_ecosystem_utilities.cpp | 9 +++------ attachments/35_gltf_ktx.cpp | 8 +++----- attachments/36_multiple_objects.cpp | 8 +++----- attachments/38_ray_tracing.cpp | 5 +++-- .../02_Graphics_pipeline_basics/02_Fixed_functions.adoc | 6 +++--- 9 files changed, 27 insertions(+), 41 deletions(-) diff --git a/attachments/27_depth_buffering.cpp b/attachments/27_depth_buffering.cpp index 3a804d8b..0be76f91 100644 --- a/attachments/27_depth_buffering.cpp +++ b/attachments/27_depth_buffering.cpp @@ -475,16 +475,14 @@ class HelloTriangleApplication .depthCompareOp = vk::CompareOp::eLess, .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; - vk::PipelineColorBlendAttachmentState colorBlendAttachment; - colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; - + vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, .attachmentCount = 1, .pAttachments = &colorBlendAttachment}; - std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; diff --git a/attachments/28_model_loading.cpp b/attachments/28_model_loading.cpp index 7db1bb9c..39a8e1af 100644 --- a/attachments/28_model_loading.cpp +++ b/attachments/28_model_loading.cpp @@ -484,16 +484,14 @@ class HelloTriangleApplication .depthCompareOp = vk::CompareOp::eLess, .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; - vk::PipelineColorBlendAttachmentState colorBlendAttachment; - colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; - + vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, .attachmentCount = 1, .pAttachments = &colorBlendAttachment}; - std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; diff --git a/attachments/29_mipmapping.cpp b/attachments/29_mipmapping.cpp index 800523cf..5e16a10e 100644 --- a/attachments/29_mipmapping.cpp +++ b/attachments/29_mipmapping.cpp @@ -484,16 +484,14 @@ class HelloTriangleApplication .depthCompareOp = vk::CompareOp::eLess, .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; - vk::PipelineColorBlendAttachmentState colorBlendAttachment; - colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; - + vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, .attachmentCount = 1, .pAttachments = &colorBlendAttachment}; - std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; diff --git a/attachments/30_multisampling.cpp b/attachments/30_multisampling.cpp index 48deec83..70b95d28 100644 --- a/attachments/30_multisampling.cpp +++ b/attachments/30_multisampling.cpp @@ -493,16 +493,14 @@ class HelloTriangleApplication .depthCompareOp = vk::CompareOp::eLess, .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; - vk::PipelineColorBlendAttachmentState colorBlendAttachment; - colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; - + vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, .attachmentCount = 1, .pAttachments = &colorBlendAttachment}; - std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; diff --git a/attachments/32_ecosystem_utilities.cpp b/attachments/32_ecosystem_utilities.cpp index d0c8c814..bec10b4f 100644 --- a/attachments/32_ecosystem_utilities.cpp +++ b/attachments/32_ecosystem_utilities.cpp @@ -740,21 +740,18 @@ class HelloTriangleApplication .depthCompareOp = vk::CompareOp::eLess, .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; - vk::PipelineColorBlendAttachmentState colorBlendAttachment; - colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; - + vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, .attachmentCount = 1, .pAttachments = &colorBlendAttachment}; - std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; vk::PipelineDynamicStateCreateInfo dynamicState{.dynamicStateCount = static_cast(dynamicStates.size()), .pDynamicStates = dynamicStates.data()}; - vk::PipelineLayoutCreateInfo pipelineLayoutInfo{.setLayoutCount = 1, .pSetLayouts = &*descriptorSetLayout, .pushConstantRangeCount = 0}; pipelineLayout = vk::raii::PipelineLayout(device, pipelineLayoutInfo); diff --git a/attachments/35_gltf_ktx.cpp b/attachments/35_gltf_ktx.cpp index 1b8853c1..9bef8ef2 100644 --- a/attachments/35_gltf_ktx.cpp +++ b/attachments/35_gltf_ktx.cpp @@ -694,16 +694,14 @@ class VulkanApplication .depthCompareOp = vk::CompareOp::eLess, .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; - vk::PipelineColorBlendAttachmentState colorBlendAttachment; - colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; - + vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, .attachmentCount = 1, .pAttachments = &colorBlendAttachment}; - std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; diff --git a/attachments/36_multiple_objects.cpp b/attachments/36_multiple_objects.cpp index 19f85865..69ce0a05 100644 --- a/attachments/36_multiple_objects.cpp +++ b/attachments/36_multiple_objects.cpp @@ -767,16 +767,14 @@ class VulkanApplication .depthCompareOp = vk::CompareOp::eLess, .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; - vk::PipelineColorBlendAttachmentState colorBlendAttachment; - colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; - + vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, .attachmentCount = 1, .pAttachments = &colorBlendAttachment}; - std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; diff --git a/attachments/38_ray_tracing.cpp b/attachments/38_ray_tracing.cpp index 05bf70ed..1aa0efce 100644 --- a/attachments/38_ray_tracing.cpp +++ b/attachments/38_ray_tracing.cpp @@ -625,8 +625,9 @@ class VulkanRaytracingApplication .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; vk::PipelineColorBlendAttachmentState colorBlendAttachment; - colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; - colorBlendAttachment.blendEnable = vk::False; + vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, diff --git a/en/03_Drawing_a_triangle/02_Graphics_pipeline_basics/02_Fixed_functions.adoc b/en/03_Drawing_a_triangle/02_Graphics_pipeline_basics/02_Fixed_functions.adoc index 3df936c9..360e0e5c 100644 --- a/en/03_Drawing_a_triangle/02_Graphics_pipeline_basics/02_Fixed_functions.adoc +++ b/en/03_Drawing_a_triangle/02_Graphics_pipeline_basics/02_Fixed_functions.adoc @@ -244,9 +244,9 @@ In our case, we only have one framebuffer: [,c++] ---- -vk::PipelineColorBlendAttachmentState colorBlendAttachment; -colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA; -colorBlendAttachment.blendEnable = vk::False; +vk::PipelineColorBlendAttachmentState colorBlendAttachment{ + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; ---- This per-framebuffer struct allows you to configure the first way of color blending. From a4a2a50977a7b5f713eba3f4bc3c151d4a8b7843 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sat, 22 Nov 2025 13:37:56 +0100 Subject: [PATCH 2/3] Remove duplicate declaration --- attachments/38_ray_tracing.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/attachments/38_ray_tracing.cpp b/attachments/38_ray_tracing.cpp index 1aa0efce..f17efe8e 100644 --- a/attachments/38_ray_tracing.cpp +++ b/attachments/38_ray_tracing.cpp @@ -624,17 +624,14 @@ class VulkanRaytracingApplication .depthCompareOp = vk::CompareOp::eLess, .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; - vk::PipelineColorBlendAttachmentState colorBlendAttachment; vk::PipelineColorBlendAttachmentState colorBlendAttachment{ .blendEnable = vk::False, .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; - vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, .attachmentCount = 1, .pAttachments = &colorBlendAttachment}; - std::vector dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor}; From 86a6eca804f62cf51e710482f745593cca1b2cd9 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sat, 22 Nov 2025 13:49:44 +0100 Subject: [PATCH 3/3] Move linewidth setup into designated initializers --- attachments/27_depth_buffering.cpp | 8 ++++---- attachments/28_model_loading.cpp | 4 ++-- attachments/29_mipmapping.cpp | 4 ++-- attachments/30_multisampling.cpp | 4 ++-- attachments/32_ecosystem_utilities.cpp | 4 ++-- attachments/35_gltf_ktx.cpp | 4 ++-- attachments/36_multiple_objects.cpp | 4 ++-- attachments/38_ray_tracing.cpp | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/attachments/27_depth_buffering.cpp b/attachments/27_depth_buffering.cpp index 0be76f91..4ffb1611 100644 --- a/attachments/27_depth_buffering.cpp +++ b/attachments/27_depth_buffering.cpp @@ -464,8 +464,8 @@ class HelloTriangleApplication .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eBack, .frontFace = vk::FrontFace::eCounterClockwise, - .depthBiasEnable = vk::False}; - rasterizer.lineWidth = 1.0f; + .depthBiasEnable = vk::False, + .lineWidth = 1.0f}; vk::PipelineMultisampleStateCreateInfo multisampling{ .rasterizationSamples = vk::SampleCountFlagBits::e1, .sampleShadingEnable = vk::False}; @@ -476,8 +476,8 @@ class HelloTriangleApplication .depthBoundsTestEnable = vk::False, .stencilTestEnable = vk::False}; vk::PipelineColorBlendAttachmentState colorBlendAttachment{ - .blendEnable = vk::False, - .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; + .blendEnable = vk::False, + .colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA}; vk::PipelineColorBlendStateCreateInfo colorBlending{ .logicOpEnable = vk::False, .logicOp = vk::LogicOp::eCopy, diff --git a/attachments/28_model_loading.cpp b/attachments/28_model_loading.cpp index 39a8e1af..d2ec57c4 100644 --- a/attachments/28_model_loading.cpp +++ b/attachments/28_model_loading.cpp @@ -473,8 +473,8 @@ class HelloTriangleApplication .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eBack, .frontFace = vk::FrontFace::eCounterClockwise, - .depthBiasEnable = vk::False}; - rasterizer.lineWidth = 1.0f; + .depthBiasEnable = vk::False, + .lineWidth = 1.0f}; vk::PipelineMultisampleStateCreateInfo multisampling{ .rasterizationSamples = vk::SampleCountFlagBits::e1, .sampleShadingEnable = vk::False}; diff --git a/attachments/29_mipmapping.cpp b/attachments/29_mipmapping.cpp index 5e16a10e..00f79a2d 100644 --- a/attachments/29_mipmapping.cpp +++ b/attachments/29_mipmapping.cpp @@ -473,8 +473,8 @@ class HelloTriangleApplication .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eBack, .frontFace = vk::FrontFace::eCounterClockwise, - .depthBiasEnable = vk::False}; - rasterizer.lineWidth = 1.0f; + .depthBiasEnable = vk::False, + .lineWidth = 1.0f}; vk::PipelineMultisampleStateCreateInfo multisampling{ .rasterizationSamples = vk::SampleCountFlagBits::e1, .sampleShadingEnable = vk::False}; diff --git a/attachments/30_multisampling.cpp b/attachments/30_multisampling.cpp index 70b95d28..0149ddf7 100644 --- a/attachments/30_multisampling.cpp +++ b/attachments/30_multisampling.cpp @@ -482,8 +482,8 @@ class HelloTriangleApplication .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eBack, .frontFace = vk::FrontFace::eCounterClockwise, - .depthBiasEnable = vk::False}; - rasterizer.lineWidth = 1.0f; + .depthBiasEnable = vk::False, + .lineWidth = 1.0f}; vk::PipelineMultisampleStateCreateInfo multisampling{ .rasterizationSamples = msaaSamples, .sampleShadingEnable = vk::False}; diff --git a/attachments/32_ecosystem_utilities.cpp b/attachments/32_ecosystem_utilities.cpp index bec10b4f..620d76fb 100644 --- a/attachments/32_ecosystem_utilities.cpp +++ b/attachments/32_ecosystem_utilities.cpp @@ -729,8 +729,8 @@ class HelloTriangleApplication .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eBack, .frontFace = vk::FrontFace::eCounterClockwise, - .depthBiasEnable = vk::False}; - rasterizer.lineWidth = 1.0f; + .depthBiasEnable = vk::False, + .lineWidth = 1.0f}; vk::PipelineMultisampleStateCreateInfo multisampling{ .rasterizationSamples = msaaSamples, .sampleShadingEnable = vk::False}; diff --git a/attachments/35_gltf_ktx.cpp b/attachments/35_gltf_ktx.cpp index 9bef8ef2..5d8fda24 100644 --- a/attachments/35_gltf_ktx.cpp +++ b/attachments/35_gltf_ktx.cpp @@ -683,8 +683,8 @@ class VulkanApplication .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eBack, // Re-enabled culling for better performance .frontFace = vk::FrontFace::eClockwise, // Keeping Clockwise for glTF - .depthBiasEnable = vk::False}; - rasterizer.lineWidth = 1.0f; + .depthBiasEnable = vk::False, + .lineWidth = 1.0f}; vk::PipelineMultisampleStateCreateInfo multisampling{ .rasterizationSamples = vk::SampleCountFlagBits::e1, .sampleShadingEnable = vk::False}; diff --git a/attachments/36_multiple_objects.cpp b/attachments/36_multiple_objects.cpp index 69ce0a05..ef705e81 100644 --- a/attachments/36_multiple_objects.cpp +++ b/attachments/36_multiple_objects.cpp @@ -756,8 +756,8 @@ class VulkanApplication .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eBack, .frontFace = vk::FrontFace::eCounterClockwise, - .depthBiasEnable = vk::False}; - rasterizer.lineWidth = 1.0f; + .depthBiasEnable = vk::False, + .lineWidth = 1.0f}; vk::PipelineMultisampleStateCreateInfo multisampling{ .rasterizationSamples = vk::SampleCountFlagBits::e1, .sampleShadingEnable = vk::False}; diff --git a/attachments/38_ray_tracing.cpp b/attachments/38_ray_tracing.cpp index f17efe8e..809f9f0c 100644 --- a/attachments/38_ray_tracing.cpp +++ b/attachments/38_ray_tracing.cpp @@ -613,8 +613,8 @@ class VulkanRaytracingApplication .polygonMode = vk::PolygonMode::eFill, .cullMode = vk::CullModeFlagBits::eBack, .frontFace = vk::FrontFace::eCounterClockwise, - .depthBiasEnable = vk::False}; - rasterizer.lineWidth = 1.0f; + .depthBiasEnable = vk::False, + .lineWidth = 1.0f}; vk::PipelineMultisampleStateCreateInfo multisampling{ .rasterizationSamples = vk::SampleCountFlagBits::e1, .sampleShadingEnable = vk::False};