片段密度图操作
获取密度值
每个中心坐标为 (x,y) 的局部帧缓冲区区域都会从片段密度图中获取纹素。
首先,局部帧缓冲区区域中心坐标 (x,y) 会被 VkSubpassFragmentDensityMapOffsetEndInfoQCOM 中指定的值偏移。如果未指定偏移,则使用默认偏移 (0,0)。偏移后的坐标 (x',y') 的计算方式如下
偏移后的坐标 (x',y') 从片段密度图中获取整数坐标处的纹素
-
\(i = \left\lfloor{\frac{x'}{fragmentDensityTexelSize_{width}}}\right\rfloor\)
-
\(j = \left\lfloor{\frac{y'}{fragmentDensityTexelSize_{height}}}\right\rfloor\)
其中帧缓冲区中每个区域的大小为
-
\(fragmentDensityTexelSize'_{width} = {2^{\lceil{\log_2(\frac{framebuffer_{width}}{fragmentDensityMap_{width}})}\rceil}}\)
-
\(fragmentDensityTexelSize'_{height} = {2^{\lceil{\log_2(\frac{framebuffer_{height}}{fragmentDensityMap_{height}})}\rceil}}\)
此区域受 VkPhysicalDeviceFragmentDensityMapPropertiesEXT
中的限制,因此最终区域大小被钳制
-
\(fragmentDensityTexelSize_{width} = \mathbin{clamp}(fragmentDensityTexelSize'_{width},minFragmentDensityTexelSize_{width},maxFragmentDensityTexelSize_{width})\)
-
\(fragmentDensityTexelSize_{height} = \mathbin{clamp}(fragmentDensityTexelSize'_{height},minFragmentDensityTexelSize_{height},maxFragmentDensityTexelSize_{height})\)
当为渲染通道启用了多视图,并且使用大于 1
的 layerCount
创建了片段密度图附件视图时,用于偏移和从片段密度图获取的图层为
否则
接下来将从密度图在 (i,j,layer) 处获取的纹素通过以下操作转换为密度。
组件混合
按照 图像组件混合 中定义的方式,将 VkImageViewCreateInfo 的 components
成员应用于获取的纹素。
片段面积转换
如果获取的密度不是大于 0.0
的归一化浮点值,则帧缓冲区区域的片段面积是未定义的。否则,该区域获取的片段面积按以下方式得出
片段面积过滤器
可以选择,实现可以在 (i,j) 周围的实现定义的窗口中获取额外的密度图纹素。纹素遵循标准的转换步骤,直到并包括片段面积转换。
实现选择帧缓冲区区域的单个获取的片段面积,并且必须具有在获取的集合的最小和最大面积之间的面积。