8.11. 插值修饰(Interpolation Decorations)
插值修饰控制了片元着色器阶段插值属性的行为。 插值修饰可以应用到片元着色器的 Input
存储类变量,并控制这些变量的插值行为。
输入变量最多可以被下列描述符中的一个所修饰:
插值的类型和是否被应用是被上述插值修饰符所控制的,同样也被附加的 Centroid
和 Sample
所描述。
一个被 Flat
修饰的变量将不会被插值。 相反,三角形内每一个片元都保持相同的值。这个值从单个provoking vertex 中获取。 一个被 Flat
修饰的变量也可以被 Centroid
或者 Sample
修饰,这表示和只有 Flat
修饰时一样的效果。
对于不是 Centroid
或 Sample
修饰的片元着色器输入变量,被赋值的变量也许会插值到像素内任意位置,一个值也许被赋值给像素内每一个采样点。
Centroid
和 Sample
可以被用于控制被修饰着色器输入变量采样的位置和频率。 如果一个片元着色器输入变量被 Centroid
修饰,像素内所有采样点都会被赋值为同一个值,但是这个值必须必须要被插值到一个位置,该位置在像素和被渲染的图元上, 包括这个图元覆盖的像素采样点中任一个点。 因为变量被插值的位置可能在临近的像素上,导数可能以两个临近像素来做计算, centroid-sampled 输入变量的导数可能比 non-centroid 插值的变量准确度偏低。 如果一个片元着色器输入被 Sample
修饰,对于该像素覆盖的每一个采样点都需要赋值一个单独的值,这个值必须从不同的采样点采样获取到。 当 rasterizationSamples
是 VK_SAMPLE_COUNT_1_BIT
时,像素中心必须被用作 Centroid
, Sample
, 和无描述采样。
有、无符号整型,整型向量,或者双精度浮点类型片元着色器输入变量必须以 Flat
描述。
8.12. 静态使用
一个SPIR-V模块使用OpVariable
指令在内存中声明一个全局对象,将产生一个x
指针指向该对象。 如果一个入口点的调用栈包含一个函数,该函数包含这个以id
为操作对象的内存指令或者图像指令x
, 一个SPIR-V模块中该特定的入口点被称为_静态使用_该对象。参看SPIR-V规范第三小节 “Binary Form`"的"`Memory Instructions” 和 “Image Instructions” 来获取完整的SPIR-V内存指令。
静态使用并不以Input
和 Output
storage用来控制变量的行为。这些变量的效果基于它们是否在着色器入口点接口中出现来生效。
8.13. 调用和衍生组
一个计算着色器的_调用组_(参看SPIR-V规范第二节的"`Control Flow`")是在单个本地工作组内一系列调用的集合。 对于图形着色器,一个调用组是在单个绘制命令内产生的指定着色器阶段的着色器调用集合的Vulkan实现各异的子集合。 对于drawCount
大于1的间接绘制命令,单个绘制内的调用在不同的调用组中。
注意
因为把调用分组为调用群依赖于Vulkan实现,且不可观测,应用程序一般需要假设在属于一个调用群的绘制操作所有调用的最糟糕情形。 |
A derivative group (see the subsection “Control Flow” of section 2 of the SPIR-V 1.00 Revision 4 specification) for a fragment shader is the set of invocations generated by a single primitive (point, line, or triangle), including any helper invocations generated by that primitive. Derivatives are undefined for a sampled image instruction if the instruction is in flow control that is not uniform across the derivative group.