175 lines
7.0 KiB
Plaintext
175 lines
7.0 KiB
Plaintext
include::meta/VK_EXT_blend_operation_advanced.txt[]
|
|
|
|
*Last Modified Date*::
|
|
2017-06-12
|
|
*Contributors*::
|
|
- Jeff Bolz, NVIDIA
|
|
|
|
This extension adds a number of "`advanced`" blending operations that can:
|
|
be used to perform new color blending operations, many of which are more
|
|
complex than the standard blend modes provided by unextended Vulkan.
|
|
This extension requires different styles of usage, depending on the level of
|
|
hardware support and the enabled features:
|
|
|
|
- If
|
|
slink:VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::pname:advancedBlendCoherentOperations
|
|
is ename:VK_FALSE, the new blending operations are supported, but a
|
|
memory dependency must: separate each advanced blend operation on a
|
|
given sample.
|
|
ename:VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT is used to
|
|
synchronize reads using advanced blend operations.
|
|
|
|
- If
|
|
slink:VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::pname:advancedBlendCoherentOperations
|
|
is ename:VK_TRUE, advanced blend operations obey primitive order just
|
|
like basic blend operations.
|
|
|
|
In unextended Vulkan, the set of blending operations is limited, and can: be
|
|
expressed very simply.
|
|
The ename:VK_BLEND_OP_MIN and ename:VK_BLEND_OP_MAX blend operations simply
|
|
compute component-wise minimums or maximums of source and destination color
|
|
components.
|
|
The ename:VK_BLEND_OP_ADD, ename:VK_BLEND_OP_SUBTRACT, and
|
|
ename:VK_BLEND_OP_REVERSE_SUBTRACT modes multiply the source and destination
|
|
colors by source and destination factors and either add the two products
|
|
together or subtract one from the other.
|
|
This limited set of operations supports many common blending operations but
|
|
precludes the use of more sophisticated transparency and blending operations
|
|
commonly available in many dedicated imaging APIs.
|
|
|
|
This extension provides a number of new "`advanced`" blending operations.
|
|
Unlike traditional blending operations using ename:VK_BLEND_OP_ADD, these
|
|
blending equations do not use source and destination factors specified by
|
|
elink:VkBlendFactor.
|
|
Instead, each blend operation specifies a complete equation based on the
|
|
source and destination colors.
|
|
These new blend operations are used for both RGB and alpha components; they
|
|
must: not be used to perform separate RGB and alpha blending (via different
|
|
values of color and alpha elink:VkBlendOp).
|
|
|
|
These blending operations are performed using premultiplied colors, where
|
|
RGB colors can: be considered premultiplied or non-premultiplied by alpha,
|
|
according to the pname:srcPremultiplied and pname:dstPremultiplied members
|
|
of slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT.
|
|
If a color is considered non-premultiplied, the (R,G,B) color components are
|
|
multiplied by the alpha component prior to blending.
|
|
For non-premultiplied color components in the range [eq]#[0,1]#, the
|
|
corresponding premultiplied color component would have values in the range
|
|
[eq]#[0 {times} A, 1 {times} A]#.
|
|
|
|
Many of these advanced blending equations are formulated where the result of
|
|
blending source and destination colors with partial coverage have three
|
|
separate contributions: from the portions covered by both the source and the
|
|
destination, from the portion covered only by the source, and from the
|
|
portion covered only by the destination.
|
|
The blend parameter
|
|
slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:blendOverlap
|
|
can: be used to specify a correlation between source and destination pixel
|
|
coverage.
|
|
If set to ename:VK_BLEND_OVERLAP_CONJOINT_EXT, the source and destination
|
|
are considered to have maximal overlap, as would be the case if drawing two
|
|
objects on top of each other.
|
|
If set to ename:VK_BLEND_OVERLAP_DISJOINT_EXT, the source and destination
|
|
are considered to have minimal overlap, as would be the case when rendering
|
|
a complex polygon tessellated into individual non-intersecting triangles.
|
|
If set to ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT, the source and
|
|
destination coverage are assumed to have no spatial correlation within the
|
|
pixel.
|
|
|
|
In addition to the coherency issues on implementations not supporting
|
|
pname:advancedBlendCoherentOperations, this extension has several
|
|
limitations worth noting.
|
|
First, the new blend operations have a limit on the number of color
|
|
attachments they can: be used with, as indicated by
|
|
slink:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::pname:advancedBlendMaxColorAttachments.
|
|
Additionally, blending precision may: be limited to 16-bit floating-point,
|
|
which may: result in a loss of precision and dynamic range for framebuffer
|
|
formats with 32-bit floating-point components, and in a loss of precision
|
|
for formats with 12- and 16-bit signed or unsigned normalized integer
|
|
components.
|
|
|
|
=== New Object Types
|
|
|
|
None.
|
|
|
|
=== New Enum Constants
|
|
|
|
* Extending elink:VkStructureType:
|
|
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT
|
|
** ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT
|
|
** ename:VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT
|
|
|
|
* Extending elink:VkAccessFlagBits:
|
|
** ename:VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT
|
|
|
|
* Extending elink:VkBlendOp:
|
|
** ename:VK_BLEND_OP_ZERO_EXT
|
|
** ename:VK_BLEND_OP_SRC_EXT
|
|
** ename:VK_BLEND_OP_DST_EXT
|
|
** ename:VK_BLEND_OP_SRC_OVER_EXT
|
|
** ename:VK_BLEND_OP_DST_OVER_EXT
|
|
** ename:VK_BLEND_OP_SRC_IN_EXT
|
|
** ename:VK_BLEND_OP_DST_IN_EXT
|
|
** ename:VK_BLEND_OP_SRC_OUT_EXT
|
|
** ename:VK_BLEND_OP_DST_OUT_EXT
|
|
** ename:VK_BLEND_OP_SRC_ATOP_EXT
|
|
** ename:VK_BLEND_OP_DST_ATOP_EXT
|
|
** ename:VK_BLEND_OP_XOR_EXT
|
|
** ename:VK_BLEND_OP_MULTIPLY_EXT
|
|
** ename:VK_BLEND_OP_SCREEN_EXT
|
|
** ename:VK_BLEND_OP_OVERLAY_EXT
|
|
** ename:VK_BLEND_OP_DARKEN_EXT
|
|
** ename:VK_BLEND_OP_LIGHTEN_EXT
|
|
** ename:VK_BLEND_OP_COLORDODGE_EXT
|
|
** ename:VK_BLEND_OP_COLORBURN_EXT
|
|
** ename:VK_BLEND_OP_HARDLIGHT_EXT
|
|
** ename:VK_BLEND_OP_SOFTLIGHT_EXT
|
|
** ename:VK_BLEND_OP_DIFFERENCE_EXT
|
|
** ename:VK_BLEND_OP_EXCLUSION_EXT
|
|
** ename:VK_BLEND_OP_INVERT_EXT
|
|
** ename:VK_BLEND_OP_INVERT_RGB_EXT
|
|
** ename:VK_BLEND_OP_LINEARDODGE_EXT
|
|
** ename:VK_BLEND_OP_LINEARBURN_EXT
|
|
** ename:VK_BLEND_OP_VIVIDLIGHT_EXT
|
|
** ename:VK_BLEND_OP_LINEARLIGHT_EXT
|
|
** ename:VK_BLEND_OP_PINLIGHT_EXT
|
|
** ename:VK_BLEND_OP_HARDMIX_EXT
|
|
** ename:VK_BLEND_OP_HSL_HUE_EXT
|
|
** ename:VK_BLEND_OP_HSL_SATURATION_EXT
|
|
** ename:VK_BLEND_OP_HSL_COLOR_EXT
|
|
** ename:VK_BLEND_OP_HSL_LUMINOSITY_EXT
|
|
** ename:VK_BLEND_OP_PLUS_EXT
|
|
** ename:VK_BLEND_OP_PLUS_CLAMPED_EXT
|
|
** ename:VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT
|
|
** ename:VK_BLEND_OP_PLUS_DARKER_EXT
|
|
** ename:VK_BLEND_OP_MINUS_EXT
|
|
** ename:VK_BLEND_OP_MINUS_CLAMPED_EXT
|
|
** ename:VK_BLEND_OP_CONTRAST_EXT
|
|
** ename:VK_BLEND_OP_INVERT_OVG_EXT
|
|
** ename:VK_BLEND_OP_RED_EXT
|
|
** ename:VK_BLEND_OP_GREEN_EXT
|
|
** ename:VK_BLEND_OP_BLUE_EXT
|
|
|
|
=== New Enums
|
|
|
|
* elink:VkBlendOverlapEXT
|
|
|
|
=== New Structures
|
|
|
|
* slink:VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT
|
|
* slink:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT
|
|
* slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT
|
|
|
|
=== New Functions
|
|
|
|
None.
|
|
|
|
=== Issues
|
|
|
|
None.
|
|
|
|
=== Version History
|
|
|
|
* Revisions 1-2, 2017-06-12 (Jeff Bolz)
|
|
- Internal revisions
|