好运百科

如何充分利用 Unity Shader 为我们的游戏增光添彩呢?

人民邮电出版社 2022-01-16 00:03:33 游戏 4 ℃

Shader入门,那人邮君一定要跟大家推荐这本《 Unity Shader 入门精要》!

这本书内容全面,结构清晰,语言通俗易懂,讲解由浅入深,适合Unity初学者、游戏开发者、程序员,也可以作为在校学生的学习用书,以及培训学校的培训教材。得到业界专家罗盛誉(风宇冲)和宣雨松(MOMO)的鼎力推荐~

冯乐乐 著

这本书有一些独到的特色:

(1) 内容独特。填补了 Unity Shader 和渲染流水线之间的知识鸿沟,对 Unity 中一些渲染机制的工作原理进行详细剖析,帮助读者解决“是什么”“为什么”“怎么做”这三个基本问题;配合大量实例,让读者在实践中逐渐掌握 Unity Shader 的编写。

(2) 结构连贯。在内容编排上颇有心思,从基础到进阶再到深入,解决读者长期以来的学习烦恼。

(3) 充分面向初学者。书中提供了大量的图示配合以文字说明,并在一些章节后提供了“答疑解惑”小节来解释那些含糊不清而初学者又经常疑问的问题。

(4) 包含了 Unity 5 在渲染方面的新内容。如多次介绍 Unity 5 中的新工具帧调试器(Frame Debugger),并借助该工具的帮助来理解Unity中的渲染过程。

(5) 补充了大量延伸阅读资料。在一些章节后提供了“扩展阅读”小节,让那些希望更加深入学习某个方向的读者可以在提供的资料中找到更多的学习内容。

涵盖内容

内容上,《 Unity Shader 入门精要》不仅教读者如何使用 Unity Shader,更重要的是要帮助读者学习 Unity 中的一些渲染机制以及如何使用 Unity Shader 实现各种自定义的渲染效果。

结构上,分为五大篇章:

一、基础篇(1-4章):为初学者普及基本的理论知识,以及所需的数学基础。

二、Shader初级篇(5-8章):从最简单的 Shader 开始,讲解 Shader中基础的光照模型、纹理、和透明效果等。同时,还会介绍一些 Shader的 Debug 技巧、Shader 里常见报错信息。

三、Shader中级篇(9-11章):进阶篇章,将讲解更加复杂的光照、高级纹理、以及如何用 Shader 实现动画等一系列进阶内容;

四、Shader高级篇(12-16章):涵盖了一些 Shader 的高级用法,如使用缓冲区、实现屏幕特效、非真实感渲染等,同时,还会介绍一些优化技巧;

五、扩展篇(17-20章):将会涵盖一些 Unity Surface Shader 背后的机制,还会针对 Unity 5.0+ 版本中的一些新的特性进行简要分析。最后,希望向大家介绍一点学习 Shader 的经验和资源。

从内容编排上可以看出作者的用心。

一睹为快

以下,就书中基础篇的“什么是渲染流水线”以及“GPU是如何实现整个渲染流水线”的相关讲解部分选摘出来,供大家学习。

===内容选摘=手动分割===

渲染流水线

渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。它的输入是一个虚拟摄像机、一些光源、一些 Shader 以及纹理等。

我们可以先把渲染流程可分成3个概念性阶段:应用阶段几何阶段、光栅化阶段

通常每个阶段本身也是一个流水线系统,即包含了子流水线阶段。图中显示了3个概念阶段之间的联系。

渲染流水线中的 3 个概念阶段

应用阶段:

这个阶段是由应用主导的,因此通常由 CPU 负责实现,开发者在这个阶段具有绝对控制权。

在这个阶段,开发者主要有三个任务:

首先,准备好场景数据,例如摄像机的位置、视锥体、场景中包含了那些模型、使用了哪些光源等;其次,为了提高渲染性能,我们往往需要做一个粗粒度剔除(culling)工作,以把那些不可见的物体剔除出去,这样就不需要再移交给几何阶段进行处理;最后,我们需要设置好每个模型的渲染状态。这些渲染状态包含但不限于它使用的材质(漫反射颜色、高光反射颜色)、使用的纹理、使用的 Shader 等。

这一阶段最重要的输出是渲染所需的几何信息,即渲染图元(rendering primitives)。通俗来讲,渲染图元可以是点、线、三角面等。这些渲染图元将被传递给下一阶段:几何阶段。

几何阶段:

几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎样绘制它们,在哪里绘制它们。这一阶段通常在 GPU上进行。

几何阶段负责和每个渲染图元打交道,进行逐顶点、逐多边形的操作。几何阶段的一个重要任务就是把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。通过对输入的渲染图元进行多步处理后,这一阶段将会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息,并传递给下一阶段。

光栅化阶段:

这一阶段将会使用上个阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像。这一阶段也是在 GPU 上运行。光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。它需要对上一个阶段得到的逐顶点数据(例如纹理坐标、顶点颜色等)进行插值,然后再进行逐像素处理。

区别于上述概念上的流水线,下面要介绍的GPU流水线,是硬件真正用于实现上述概念的流水线。

CPU和GPU之间的通信

渲染流水线的起点是CPU,即应用阶段

应用阶段可分为以下三个小阶段:

(1)把数据加载到显存中:

所有渲染所需的数据都需要从硬盘中加载到系统内存中。然后,网格和纹理等数据又被加载到显卡的存储空间——显存中。

(2)设置渲染状态:

渲染状态通俗的解释是,这些状态定义了场景中的网格是怎样被渲染的。

例如,使用哪个顶点着色器/片元着色器、光源属性、材质等。如果我们没有更改渲染状态,那么所有的网格都将使用同一种渲染状态,如下图显示了当使用同一种渲染状态时,渲染3个不同网格的结果。

在同一状态下渲染3个网格。由于没有更改渲染状态,因此三个网格的外观看起来像是同一种材质的物体

准备好上述工作后,CPU会调用渲染命令 Draw Call 来告诉 GPU 开始渲染。

(3)调用 Draw Call:

当给定了一个Draw Call 时,GPU就会根据渲染状态(例如材质、纹理、着色器等)和所有输入的顶点数据来进行计算,最终输出成屏幕上显示的那些漂亮的像素。而这个过程,就是GPU 流水线。

CPU 通过调用 Draw Call 来告诉 GPU 开始进行一个渲染过程

GPU 流水线

当GPU从CPU那里得到渲染命令后,就会进行一系列流水线操作,最终把图元渲染到屏幕上。

对于概念阶段的后两个阶段——几何阶段和光栅化阶段,可分成若干更小的流水线阶段,如下图所示。

GPU 的渲染流水线实现

「图中绿色表示该流水线阶段是完全可编程控制的,黄色表示该流水线可以配置但不是可编程的,蓝色表示该流水线阶段是由 GPU 固定实现的,开发者没有任何控制权。实线表示该 Shader 必须由开发者编程实线,虚线表示该 Shader 是可选的。」

从图中可以看出,GPU 的渲染流水线接收顶点数据作为输入。这些顶点数据是由应用阶段加载到显存中,再由 Draw Call 指定的。这些数据随后被传递给顶点着色器。

顶点着色器(Vertext Shader)是完全可编程的,它通常用于实现顶点的空间变换、顶点着色等功能。曲面细分着色器(Tessellation Shader)是一个可选的着色器,它用于细分图元。几何着色器(Geometry Shader)是可选的着色器,可以被用于执行逐图元的着色操作,或者被用于产生更多的图元。裁剪阶段的目的是将不在摄像机视野内的顶点裁减掉,并剔除某些三角图元的面片。这个阶段是可配置的。几何概念阶段中的最后一个流水线阶段是屏幕映射。这一阶段是不可配置和编程的,它负责把每个图元的坐标转换到屏幕坐标系中。

光栅化概念阶段中的三角形设置(Triangle Setup )三角形遍历(Triangle Traversal )阶段也都是固定函数(Fixed-Function)的阶段。

片元着色器(Fragment Shader )是完全可编程的,它用于实现逐片元(Per-Fragment)的着色操作。逐片元操作(Per-Fragment Operations )阶段负责执行很多重要的操作,例如修改颜色、深度缓冲、进行混合等,它不是可编程的,但具有很高的可配置性。

最终生成我们看到的屏幕图像。

接下来,如何充分利用 Unity Shader 为我们的游戏增光添彩呢? Unity Shader 入门精要》有更多技巧等你揭晓

希望这本书可以为大家打开一扇新的大门,让大家离制作心目中杰出游戏的心愿更近一步。

标 签阶段 流水线 顶点

熱門文章

Copyright ©2022好运百科 聯系我們

Powered: https://www.haoyunbaike.com/