Unity3D shader入门介绍



  • 一、基本概念

         Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。

         所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。

       Shader大体上可以分为两类,简单来说

        (1)表面着色器(Surface Shader) - 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果。类比卡片机,上手以后不太需要很多努力就能拍出不错的效果。

        (2)片段着色器(Fragment Shader) - 可以做的事情更多,但是也比较难写。使用片段着色器的主要目的是可以在比较低的层级上进行更复杂(或者针对目标设备更高效)的开发。本文是入门文章,所以之后的介绍将主要集中在表面着色器上。

    二、shader程序基本结构

    一个普通的着色器的结构如下:

               


                                       

        首先是一些属性定义,用来指定这段代码将有哪些输入。接下来是一个或者多个的子着色器,在实际运行中,哪一个子着色器被使用是由运行的平台所决定的。子着色器是代码的主体,每一个子着色器中包含一个或者多个的Pass。在计算着色时,平台先选择最优先可以使用的着色器,然后依次运行其中的Pass,然后得到输出的结果。最后指定一个回滚,用来处理所有Subshader都不能运行的情况(比如目标设备实在太老,所有Subshader中都有其不支持的特性)。

    需要提前说明的是,在实际进行表面着色器的开发时,我们将直接在Subshader这个层次上写代码,系统将把我们的代码编译成若干个合适的Pass。

    三.Unity中Shader的三种基本类型

    我们知道,计算机图形学的中渲染管线一般可以分为两种类型:

    1.固定功能渲染管线(fixed-functionrendering pipelines)

    2.可编程渲染管线(programmablerendering pipelines)

    按这样的分类思路,在Unity中,Shader便可以分成如下三种基本类型:

    2.1  固定功能着色器(Fixed Function Shader)

    2.2  表面着色器(Surface Shader)

    2.3  顶点着色器&片段着色器 (Vertex Shader & Fragment Shader)

    顾名思义,其中的固定功能着色器便是我们所说的固定功能渲染管线(fixed-functionrendering pipelines)的具体表现,而表面着色器、顶点着色器以及片段着色器便属于可编程渲染管线。下面分别对其进行简单的介绍

    3.1关于固定功能着色器

    这里的固定功能着色器可以说是Unity为Shader的书写自带的一层壳,Unity已经在内部为我们做了大量的工作,我们只要稍微记住一些关键字、一些规范就可以实现出很多不错的效果。固定功能着色器是我们初学Unity Shader的最近几篇文章中的主要学习对象。而后面的表面着色器、顶点着色器以及片段着色器就是在固定功能着色器的基础上嵌套了CG语言的代码而成的更加复杂的着色器。我们来看看他们的一些基本概念。

    3.2 关于表面着色器

    表面着色器(Surface Shader)这个概念更多的只是在Unity中听说,可以说是Unity自己发扬光大的一项使Shader的书写门槛降低和更易用的技术。我们会在接下来的学习中逐渐意识到Unity是如何为我们把Shader的复杂性包装起来,使其书写的过程更便捷和易用的。

    3.3 关于顶点着色器和片段着色器

    研究过Direct3D和OpenGL着色器编程的童鞋们一定对这两者不陌生。我们来简单介绍一下他们的用途。

    顶点着色器:产生纹理坐标,颜色,点大小,雾坐标,然后把它们传递给裁剪阶段。

    片段着色器:进行纹理查找,决定什么时候执行纹理查找,是否进行纹理查找,及把什么作为纹理坐标

    3.4 如何区分Unity中的Shader类型

    在Unity中想要区分他们很简单。后面熟悉了自然知道。在这里浅墨先剧透一下:

    没有嵌套CG语言,也就是代码段中没有CGPROGARAM和ENDCG关键字的,就是固定功能着色器。嵌套了CG语言,代码段中有surf函数的,就是表面着色器。嵌套了CG语言,代码段中有#pragma vertex name和 #pragma fragment frag声明的,就是顶点着色器&片段着色器。

        以上是对Unity3D Shader相关的理论基础入门,有兴趣的朋友可以结合相关实例对理论架构有个更好的理解。
    --------------------- 
    作者:weixin_38498942 
    来源:CSDN 
    原文:https://blog.csdn.net/weixin_3... 
    版权声明:本文为博主原创文章,转载请附上博文链接!


Log in to reply