且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Unity着色器和屏幕特效开发秘笈》—— 1.2 创建基本的表面着色器

更新时间:2022-10-02 11:11:23

本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈》一 书中的第1章,第1.2节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.2 创建基本的表面着色器

随着我们进一步学习本书,你已经知道如何在Unity当中设置工作区,从而提高你的工作效率,而且这很容易实现。如果你已经熟悉了在Unity 4中创建着色器和设置材质,可以跳过这个教程。这里,我们只是为了确保新的Unity 4开发者能够顺利学习有关表面着色器的其他教程。

1.2.1 准备工作

开始学习本教程之前,你需要先打开Unity 4,并且创建新的项目。在本书中有一个Unity项目,所以当你学习到相应的教程时,你可以使用这个项目并添加自定义的着色器。当你完成了这些,现在就准备进入实时阴影的奇妙世界吧!

1.2.2 如何操作

在开始我们第一个着色器之前,我们需要创建一个小的场景(scene)供我们使用。这可以通过Unity编辑器中的GameObject | Create Other菜单来完成。然后可以创建一个平面作为地面,创建两个球体作为着色器的应用对象,以及一个定向光作为场景的灯光。场景建立完毕,我们就可以开始编写着色器了:

  1. 在Unity编辑器的Project面板上,右击Assets文件,选择Create | Folder。
    《Unity着色器和屏幕特效开发秘笈》—— 1.2 创建基本的表面着色器
  1. 重命名创建的着色器文件夹,可以选中文件夹然后右击选择“Rename”,也可以使用键盘上的“F2”键。
  2. 创建另一个文件夹,将其重命名为“Materials”。
  3. 选中着色器文件夹单击右键,选择Create | Shader。然后在“Materials”文件夹上单击右键,选择Create| Materials。
  4. 将刚才创建的Shader和Material都重命名为BasicDiffuse。
  5. 双击BasicDiffuse着色器,打开MonoDevelop(Unity的默认脚本编辑器),它将会自动启动编辑器并显示着色器代码。
    你会看到Unity已经为我们添加了一些基本的着色器代码,默认情况下,你将得到基本的漫反射着色器,它会接受一个纹理信息。我们会修改这些基本代码,这样我们就可以学习如何快速地开发自定义着色器。
  6. 现在我们需要给着色器一个自定义文件夹路径。着色器代码中的第一行是对着色器的自定义描述,这样我们就可以在Unity着色器下拉列表中找到它,并且将它赋给某个材料。我们已经将着色器路径重命名为Shader “CookbookShaders/BasicDiffuse”,但是你可以在你需要的任何时刻对它进行重命名。所以你无须担心它此刻的依赖关系。保存MonoDevelop的shader代码,回到Unity 编辑器。当它确认文件已更新时,Unity将自动编译着色器。这样可以使着色器实时地显示它的效果:
    《Unity着色器和屏幕特效开发秘笈》—— 1.2 创建基本的表面着色器

《Unity着色器和屏幕特效开发秘笈》—— 1.2 创建基本的表面着色器

  1. 选择我们在步骤4中创建的名为BasicDiffuse的材质,并在Inspector面板中进行查看。从Shader下拉列表中选择CookbookShaders| BasicDiffuse(如果你选择使用不同的路径名,你的着色器路径可能是不同的)。将你的着色器赋给材质,以便你可以将其赋给某个物体。
    要将材质赋给某个物体,可以从Project面板上通过简单选中拖曳至视图中的物体。也可以在Unity 编辑器中拖曳一种材质至物体的Inspector面板中。

《Unity着色器和屏幕特效开发秘笈》—— 1.2 创建基本的表面着色器

此时它看起来没什么效果,但着色器的开发环境已经设置好了,现在我们可以开始修改着色器代码,以满足我们的需求。

1.2.3 实现原理

Unity已经帮你完成了着色器和运行环境的建立,你只需要简单地点击几下鼠标便可以开始后面的工作了。对于表面着色器本身而言,很多元素都是在后台工作的。Unity采用Cg作为着色语言,Cg语言使你的代码编写更加高效。表面着色器语言大多基于组件的方式写入着色器。如纹理坐标和转置矩阵之类的功能Unity已经帮你实现了,因此你不必从头开始了。以前,为了编写一个新的着色器,你必须重复重写很多代码。在你已经熟悉表面着色器之后,你自然想探索更多关于Cg语言的基本功能,以及Unity是如何在底层的图形处理单元(GPU)上执行低级图形运算的。
因此,通过简单地更改着色器路径名,我们已经拥有了一个可以在Unity下运行的基础漫反射着色器,包含的灯光和阴影也能正常工作。而这一切的实现只需改变一行代码而已!

1.2.4 参考

为了了解更多关于Unity内置的大量Cg功能,可以访问Unity安装目录下的Unity4EditorDataCGIncludes,有三个文件需要特别注意的,UnityCG.cginc、Lighting.cginc和 UnityShaderVariables.cginc.。目前我们的着色器使用的正是这三个文件里的功能。
我们会在第9章更加深入地学习Cglncludes文件。