Vulkan规范:第八章 8.3 ~ 8.10

本文介绍了图形管线中各种着色器的工作原理及其执行过程,包括顶点着色器、细分控制着色器、细分求值着色器、几何着色器和片元着色器等,探讨了它们如何处理数据并生成最终图像。

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.

Vulkan被称为OpenGL的接班人,性能果然是霸气外漏,更能够承载下一个时代的图形渲染编程。 GPU高性能渲染的课题进入了一个新的阶段,对于计算细节的控制,多核CPU多线程渲染以及高性能算法的灵活设计需求日益旺盛。图形程序员需要有更加强力且灵活的工具,来“解锁”我们自身的控制能力,OpenGL的较高度封装性以及单纯的状态机模式显然已经无法适应现代化图形渲染的强烈需求。为什么要学习Vulkan?正如前言所说,Vulkan已经成为了下一个时代的图形渲染主流API,早已经被各大商业引擎(Unreal Engine、Unity3D)所支持。那么我们的同学就有如下问题需要明晰:1 作为游戏程序员我们只学会了UE或者Unity3D,那么就只能作为一个普通的程序员,如果能够结合Vulkan的学习对商用引擎理解更加深刻,就可以更好的发挥引擎威力甚至更改引擎的源代码,实现更多的可能,让你在各大公司之间都“蛇形走位,游刃有余” 2 作为自研引擎工作人员,你可能在工业软件领域从业、也有可能在影视渲染领域从业、也可能在其他的图形系统领域(军工、GIS、BIM)等领域,那么熟练的掌握Vulkan就可以针对自己公司的不同领域需求进行不同的引擎定制开发,从而获得牢不可破的地位,对于自身职业发展有着极大的优势! 总而言之,越早学习Vulkan,就越能与别人拉开差距,让Vulkan称为你升职加薪、壮大不可替代性的核武器! 课程简介:本课程详细讲解了Vulkan从小白到入门的基础理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了计算机图形学基础理论,计算机图形学数学推导,Vulkan基础系统设计理论,基础单元(实例,设备,交换链), 渲染管线,RenderPass, 指令与多线程, 顶点描述与实验, Uniform与描述符, 图像与采样, 深度与反走样,模型与摄像机等内容;课程中会对Vulkan复杂抽象的API进行一次包装层的封装,将相关的API都进行聚合与接口设计,作为游戏或者图形引擎来讲,这是至关重要的第一步。这一个封装步骤,也被称为API-Wrapper,经过包装后的类库,同学可以在此之上根据自己的具体需求进行扩展,从而得到最适合自己的类库内容。本课程为系列化课程,在铸造基石篇章之后,会继续使用本包装类库进行改良,并且实现Vulkan API下的各类效果以及高级特性的开发教学。 课程优势:1 本课程会从计算机图形学的基础渲染管线原理出发,带领0基础的同学对计算机图形学进行快速认知,且对必要的知识点进行筛选提炼,去掉冗余繁杂的教学内容,更加适合新手对Vulkan渲染体系入门了解。 2 本课程会对计算机图形学所涉及的数学知识及如何应用到渲染当中,进行深入的讲解,带领同学对每一行公式展开认识,从三维世界如何映射到二维的屏幕,在学习完毕后会有清晰的知识体系 3 本课程会带领同学认知每一个VulkanAPI,并且在代码当中插入详细的注释,同学们在学习的时候就可以参照源代码进行一系列尝试以及学后复习 4 本课程所设计的包装层,会带领同学一行一行代码实现,现场进行Debug,对于Vulkan常出现的一些问题进行深入探讨与现场纠正  学习所得:1 同学们在学习后可以完全了解从三维世界的抽象物体,如何一步步渲染称为一个屏幕上的像素点。2 同学们在学习后可以完全掌握基础的Vulkan图形API,并且了解Vulkan当中繁多的对象之间相互的联系,从而可以设计更好的图形程序3 同学们在跟随课程进行代码编写后,可以获得一个轻量级的Vulkan底层API封装库(Wrapper),从而可以在此之上封装上层的应用,得到自己的迷你Vulkan图形渲染引擎当然,在达到如上三点之后,如果可以更进一步学习Vulkan的进阶课程,同学们可以获得更好的职业发展,升职加薪之路会更加清晰,成为公司不可替代的强力工程师 本课程含有全套源代码,同学购买后,可以在课程附件当中下载 完全不懂图形学可以学习么?使用层面上来讲是没有问题的,老师在每个api讲解的时候,都会仔细分析api背后的原理,所以可以跟随下来的话,能够编程与原理相融,学会使用 数学不好可以学习么?学习图形类课程,最好能够入门级别的线性代数,具体说就是: 1 向量操作 2 矩阵乘法 3 矩阵的逆、转置 这几个点就足够 学习后对就业面试有什么作用?目前类似Vulkan的渲染知识是一切引擎的基础,只要能够跟随每一节课写代码做下来,游戏公司、工业软件公司等都是非常容易进去的,因为原理层面已经通晓,面试就会特别有优势。同学可以在简历上写熟悉VulkanAPI并且有代码经验,对于建立筛选以及面试都会有很大的帮助,对于薪资也会有大幅度提升
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值