[Shader] 什么是着色器?

56 篇文章 2 订阅

2.0.1. | 什么是着色器?

考虑到一些先前的知识,我们将讨论 Unity 中的着色器主题。 着色器是一个带有“.shader”扩展名的小程序(例如 color.shader),可用于在我们的项目中生成有趣的效果。 在内部,它具有数学计算和指令(命令)列表,允许对计算机屏幕上覆盖对象的区域内的每个像素进行颜色处理。

该程序允许我们根据多边形对象的属性绘制元素(使用坐标系)。 着色器由 GPU 执行,因为它们具有并行架构,该架构由数千个小型高效内核组成,旨在同时解决任务,而 CPU 则设计用于顺序串行处理。

请注意,Unity 具有三种与着色器关联的文件类型。 首先,我们有带有“.shader”扩展名的程序,能够在不同类型的渲染管道中进行编译。

其次,我们的程序具有“.shadergraph”扩展名,只能在Universal RP 或High Definition RP 中编译。 此外,我们还有扩展名为“.hlsl”的文件,允许我们创建自定义函数; 通常在 Shader Graph 中名为“自定义函数”的节点类型中使用。

还有另一种类型的程序,其扩展名为“.cginc”,我们稍后将详细讨论。 目前,我们将限制自己进行以下关联:“.cginc”链接到“.shader”CGPROGRAM,“.hlsl”链接到“.shadergraph”HLSLPROGRAM。 了解这种类比非常重要,因为每个扩展都实现不同的功能并在特定的上下文中使用。

在这里插入图片描述
(图 2.0.1a.Unity 中着色器的参考图标)

在Unity中,至少定义了四种类型的结构来生成着色器,其中我们可以找到顶点着色器和片段着色器的组合,然后是用于自动照明计算的表面着色器和用于更高级概念的计算着色器。 这些结构中的每一个都具有先前描述的有助于编译过程的属性和功能; 我们还可以轻松定义我们的操作,因为软件会自动添加这些结构。

2.0.2. | 编程语言简介。

在开始定义代码之前,我们必须考虑到 Unity 中存在三种与着色器开发相关的编程语言,它们是 HLSL(高级着色器语言 - Microsoft)、Cg(C for Graphics - NVIDIA),它们仍然可以编译到着色器中,但在当前版本的软件和 ShaderLab(声明性语言 - Unity)中不再使用。

我们将开始在内置 RP 中使用 Cg 和 ShaderLab 语言进行冒险,然后在Universal RP 中引入 HLSL。

Cg 是一种高级编程语言,旨在在大多数 GPU 上进行编译。 它由 NVIDIA 与 Microsoft 合作开发,使用与 HLSL 非常相似的语法。 着色器使用 Cg 语言的原因是它们可以编译 HLSL 和 GLSL(OpenGL 着色语言),从而加速和优化视频游戏材质的创建过程。

当我们创建着色器时,我们的代码在名为 CGPROGRAM 的字段中编译。 Unity 目前正在致力于在 Cg 和 HLSL 之间提供进一步的支持和兼容性,因此很可能很快这些块将被 HLSLPROGRAM 和 ENDHLSL 取代,因为 HLSL 是当前版本的 Unity(2019 版及以上版本)中的官方着色器编程语言。

Unity 中的所有着色器(Shader Graph 和 Compute 除外)都是使用名为 ShaderLab 的声明性语言编写的。 该语言的语法允许您在 Unity 检查器中显示着色器的属性。 这非常有趣,因为我们可以实时操纵变量和向量的值,调整着色器以获得所需的结果。

在ShaderLab中,我们可以手动定义几个属性和命令,其中包括Fallback块,它与现有的不同类型的渲染管道兼容。

Fallback 是多平台游戏中的基本代码块。 它允许我们将不同的着色器编译为已生成错误的着色器。 如果着色器在编译过程中中断,则后备会返回不同的着色器,因此图形硬件可以继续其工作。

SubShader 是 ShaderLab 中的另一个块,它允许我们声明命令并生成passes。 当用 Cg/HLSL 编写时,着色器可以包含多个 SubShader 或passes,但是,在 Scriptable RP 的情况下,着色器每个 SubShader 只能包含一个pass。

2.0.3. | 着色器类型。

要开始创建着色器,我们必须首先在 Unity 中创建一个新项目。 如果您使用 Unity Hub,建议使用最新版本的软件(例如 2019、2020 或 2021)创建项目。

我们需要一个Built-in RP 的 3D 模板来促进对图形编程语言的理解。 创建项目后,我们必须右键单击项目窗口(ctrl + 5 或 cmd + 5),转到“Create”并选择“Shader”选项。

在这里插入图片描述
正如我们所看到的,着色器的类型不止一种,其中,我们可以发现:

• Standard Surface Shader.
• Unlit Shader.
• Image Effect Shader.
• Compute Shader.
• Ray Tracing Shader.

着色器列表可能会有所不同,具体取决于用于创建项目的 Unity 版本。 另一个可能影响列表中出现的着色器数量的变量是 Shader Graph。 如果项目是在 Universal RP 或 High Definition RP 中创建的,则它可能包含 Shader Graph 包,这会增加可创建的着色器数量。

我们暂时不会详细讨论这个主题; 由于在开始使用之前我们必须了解一些概念,因此我们将简单地限制自己使用Built-in RP 中默认提供的着色器。

在创建第一个着色器之前,我们将对软件中存在的不同类型进行一些回顾。

2.0.4. | Standard surface shader.

此类着色器的特点是代码编写优化,与基本光照模型交互,并且仅适用于内置 RP。 如果我们想创建一个与光交互的着色器,我们有两个选择:

  1. 使用无光照着色器并添加允许在材质上进行光照渲染的数学函数。
  2. 或者使用标准表面着色器,它具有基本的照明模型,在某些情况下包括反照率( albedo )、镜面反射( specular )和漫反射( diffuse )。

2.0.5. | Unlit shader.

“Lit”这个词是指受光照影响的材质,“Unlit”则相反。 无光照着色器指的是原色模型,并且将是我们通常用来创建效果的基本结构。 此类程序非常适合低端硬件,其代码没有优化; 因此,我们可以看到它的完整结构并根据我们的需要对其进行修改。 它的主要特点是它可以在Built-in RP 和Scriptable RP 中运行。

2.0.6. | Image effect shader.

它在结构上与无光照着色器非常相似。 图像效果主要用于 Built-in RP 中的后处理效果,需要函数“OnRenderImage”(C#)。

2.0.7. | Compute shader.

这类程序的特点是运行在显卡上,在正常渲染管线之外,结构上与前面提到的着色器有很大不同。

与普通着色器不同,它的扩展名是“.compute”,编程语言是HLSL。 计算着色器在特定情况下用于加速某些游戏处理。

本书第三章详细回顾了这种类型的着色器。

2.0.8. | Ray tracing shader.

光线追踪着色器是一种实验性程序,扩展名为“.raytrace”。 它允许在 GPU 上进行光线追踪处理。 它仅适用于High Definition RP,并且有一些技术限制。 如果我们想要使用 DXR(DirectX 光线追踪),我们必须至少拥有一张 GTX 1080 显卡或具有 RTX 支持的同等显卡、Windows 10 版本 1809+ 和 Unity 2019.3b1 及以上版本。

我们可以使用这种程序来替换光线投射处理算法中的“.compute”类型着色器,例如全局照明( global illumination )、反射( reflections )、折射( refraction )或焦散( caustic )。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值