ainatipen 发表于 2022-1-7 10:31

UnityShader的三种形式

在Unity得project窗口中右键>Creat>Shader,可以发现Unity提供了四种UnityShader模板:Standard Suface Shader、Unlit Shader、Image Effect Shader、Compute Shader。这些UnityShader是Unity为了控制渲染层提供的一层抽象,减轻了开发者的学习门槛,且统一用ShaderLab(Unity提供的一种编写UnityShader的一种说明性语言)来编写的。Unity会根据不同的平台把UnityShader编译成真正的代码和Shader文件。


      上述四种UntiyShader中,Compute Shader会编译为一种特殊的shader,可以利用GPU的并行性来进行一些与常规渲染流水线无关的计算,书中没有做过多的介绍。去官方文档查了下,看的不是很明白,暂且放一放,先搞其他三种。
      UnityShader可以用三种不同的方式编写:表面着色器(Surface Shaders)、顶点和片元着色器(Vertex and Fragment Shaders)、固定函数着色器(Fixed Function Shaders)。剩下的三种UnityShader模板(Standard Suface Shader、Unlit Shader、Image Effect Shader),我们就按照编写方式来分类了解。

[*]表面着色器(Surface Shaders)
      表面着色器是Unity自己创造的一种着色器代码类型,其实此种方式在最后还是会转换为顶点/片元Shader,只是Unity在背后处理了许多的光照细节,因此渲染的代价较大,我们右键Creat出的Standard Suface Shader模板就是按照表面着色器的方式编写。
      官方文档说明如下:如果着色器需要受到光照和阴影的影响,则表面着色器是您的最佳选择。表面着色器以简洁的方式使编写复杂的着色器变得容易 - 这是与 Unity 光照管线进行交互的更高级别抽象。大多数表面着色器自动支持前向和延迟光照。您可以用几行 Cg/HLSL 编写表面着色器,随后就能在此基础上自动生成更多代码。如果您的着色器与光照没有任何关联,请不要使用表面着色器。对于后期处理效果或许多特殊效果着色器,表面着色器是次优选项,因为它们会无缘无故进行大量光照计算。

[*]顶点和片元着色器(Vertex and Fragment Shaders)
      顶点和片元着色器是UnityShader中最灵活的一种编写方法,同时也是最复杂的。其实令外两种编写方式Unity都会在悄咪咪的编译为此种方式。我们右键Creat出的Unlit Shader、Image Effect Shader两种模板实际上都是基于这种方式编写的,只不过Image Effect Shader是为我们提供了一个实现各种屏幕后处理效果的基本模板,而Unlit Shader提供的是一个不包含光照的顶点和片元着色器的基本模板。
      官方文档说明如下:如果您的着色器不需要与光照交互,或者如果您需要无法由表面着色器处理的非常奇特的效果,则需要使用顶点和片元着色器。以这种方式编写的着色器程序是创建所需效果的最灵活方法(甚至表面着色器也会自动转换为一堆顶点和片元着色器),但这需要付出代价:必须编写更多的代码并且更难以让它与光照互动。这些着色器也是以Cg/HLSL编写。
[*]固定函数着色器(Fixed Function Shaders)
       固定管线的编程方式已经已经逐渐被抛弃了,主要为了支持一些不支持可编程管线的老旧设备,且在Unity5.2之后,所有的固定函数着色器都会被Unity'编译为对应的顶点/片元着色器,因此此处不再赘述,由需要的童鞋可以下边的官方文档。
页: [1]
查看完整版本: UnityShader的三种形式