Vulkan规范:第八章 8.3 ~ 8.10

来源:互联网 发布:域名注册好了怎么使用 编辑:程序博客网 时间:2024/05/16 19:44

8.4. 着色器的输入和输出

数据通过 input 和 output修饰的变量传入和传出着色器。 在不同阶段之间用户自定义的输入和输出是通过匹配Location修饰符来联系起来的。 另外,可以使用 BuiltIn 修饰符来对执行环境中特殊函数提供数据或进行数据交换。

在很多场合下,同一个BuiltIn可以在多个着色器阶段使用,含义相近。 BuiltIn修饰的变量的行为在下面小节中有记录。

8.5. 顶点着色器

对每一个顶点和它相关的vertex attribute数据,都调用一次顶点着色器, 输出一个顶点和相关的数据。 图形管线必须包含一个顶点着色器,且顶点着色器阶段始终都是图形管线的第一个阶段。

8.5.1. 顶点着色器的执行

在一个绘制命令中,对于一个顶点至少执行一次。 在执行期间,对着色器提供了顶点的索引和顶点本身数据。 在着色器内声明的输入变量通过Vulkan实现填充与调用关联的顶点属性值。

如果在一个绘制命令中同一个顶点出现多次(),且如果顶点着色总是产生相同的结果, Vulkan实现也许会重用该结果。

注意

顶点着色的结果什么时候、是否被重用以及顶点着色器被执行多少次,都是依赖于Vulkan实现的。 当顶点着色器包含存储或者原子操作时依然如此(参看 vertexPipelineStoresAndAtomics)。

8.6. 细分控制着色器

细分控制着色器是用来读取应用程序提供的输入图元,并产生一个输出图元。 对于一个图元及关联的数据,调用一次细分控制着色器(在顶点着色器处理完一个图元所有的顶点之后), 并每一个输出图元输出一个控制点及关联数据,也可以输出附加的图元数据。 按照VkPipelineTessellationStateCreateInfopatchControlPoints成员来调整输入图元的顶点个数, 这是输入组装的一部分。 输出图元的大小由细分控制或细分求值着色器指定的OpExecutionMode OutputVertices 控制, 至少在其中一个着色器中指定。 输入、输出图元的大小必须大于0,不大于VkPhysicalDeviceLimits::maxTessellationPatchSize

8.6.1. 细分控制着色器的执行

对于一个图元内每一个 output 顶点都至少调用一次细分控制着色器。

细分控制着色器的输入是由顶点着色器生成的。 每一次细分控制着色器调用可以读取任何一个输入的顶点的属性和它关联的数据。 对于一个给定图元的多次着色器调用逻辑上并行执行,相对顺序是未定义的。 然而,通过在一个图元内同步着色器调用,OpControlBarrier 指令可以用来提供对执行顺序的有限度的控制, 有效地把细分控制着色器执行划分为多个周期。 如果一次调用在同一个周期内读取被其他调用写入的逐顶点或者逐图元属性, 或者两个调用尝试在一个周期内向一个图元输出写入,细分控制着色器将读取到未定义的值。

8.7. 细分求值着色器(Tessellation Evaluation Shaders)

细分求值着色器在控制点组成的输入图元和它关联数据上进行操作,单个输入重心坐标表示了在子图元中调用的对象的相对位置, 输入单个顶点和关联数据。

8.7.1. 细分求值着色器的执行

对细分器生成的每一个顶点至少调用一次细分求值着色器。

8.8. 几何着色器

几何着色器在一个输入图元上一系列的顶点和它们关联的数据上进行操作,输入零个或者多个输出图元,和它们的顶点及输出每个图元 需要的关联数据。

8.8.1. 几何着色器的执行

对于细分阶段产生的每一个图元,几何着色器至少被调用一次,或者没有使用细分时primitive assembly 生成的每一个图元都调用至少一次。 每一个输入图元调用几何着色器的次数是由几何着色器中OpExecutionMode Invocations指定的每图元几何着色器调用次数 决定。 如果调用次数未指定,默认只调用一次。

8.9. 片元着色器

片元着色器作为图形管线栅格化的结果被调用。 每一次片元着色器调用都作用在一个片元和它关联的数据上。 除了少数例外,片元着色器并不访问其他片元关联的数据,和其他片元关联的片元着色器的执行之间是孤立的。

8.9.1. 片元着色器的执行

对于栅格化产生的每个片元,一个片元着色器都被调用一次。 如果 Early Per-Fragment Tests导致它没有被覆盖到 ,一个片元着色器就不能被调用。 还有,如果第一个图元栅格化生成的片元的输出将会被同一个subpass中第二个图元栅格化产生的片元所覆盖, 且该片元所对应的片元着色器没有其他副作用,那么第一个图元中这个片元可能不需要执行片元着色器。

不同的片元着色器相对的执行顺序是未定义的。

每一个像素对应的片元着色器调用次数由以下规则决定:

  • 如果开启了逐采样着色,每一个被覆盖的采样点都被执行一次。

  • 否则,每一个片元都至少需要执行一次片元着色器,但是每一个覆盖到的采样点无需执行多次。

关于片元着色器调用,除了上面强调的条件外,片元着色器也可被 helper invocation 产生。 一个 helper invocation是一次片元着色器调用,只为了给非helper 片元着色器求导而产生的。 helper 调用所执行的存储和原子操作不能给内存造成任何副作用,helper调用中原子指令返回的值是为定义的。

8.9.2. 早期片元测试

Vulkan提供了显式的控制,允许片元着色器开启早期片元测试。如果片元着色器指定了EarlyFragmentTestsOpExecutionMode, 在Early Fragment Test Mode中描述过的逐片元测试发生在片元着色器执行之前。 否则,它们在片元着色器执行之后才被执行。

8.10. 计算着色器

可通过 vkCmdDispatch 和vkCmdDispatchIndirect 命令来调用计算着色器。 总的来说,它们在各着色器阶段执行时与图形管线的一部分对资源有类似的访问权限。

Compute workloads are formed from groups of work items called workgroups and processed by the compute shader in the current compute pipeline. A workgroup is a collection of shader invocations that execute the same shader, potentially in parallel. Compute shaders execute in global workgroups which are divided into a number of local workgroups with a size that can be set by assigning a value to the LocalSize execution mode or via an object decorated by theWorkgroupSize decoration. An invocation within a local workgroup can share data with other members of the local workgroup through shared variables and issue memory and control flow barriers to synchronize with other members of the local workgroup.

原创粉丝点击