Unity Shaders and Effets Cookbook
《着色器和屏幕特效制作攻略》
这本书可以让你学习到如何使用着色器和屏幕特效让你的Unity工程拥有震撼的渲染画面。
—— Kenny Lammers
Unity Shaders and Effets Cookbook
Unity Shaders and Effets Cookbook
《着色器和屏幕特效制作攻略》
I like this book!记录学习过程并分享!
第一章:漫反射着色器
本章覆盖的内容是游戏开发中,在着色器流水线里一些常见的漫反射技术。你将会学到:
介绍
漫反射的内部结构,或者光照模型决定着一个shader质量的高低。所以,在开始写shader时,自定义漫反射计算的过程是非常有意义的。 在早期的计算机图形学中,漫反射着色器是使用固定功能的光照模型来完成的,图形程序员也只能稍微调整一下内置的这个光照模型,并且里面只能使用一组参数和纹理。在目前的行业中,Cg语言让我们对它可以进行更多的控制,并且还具备很大的灵活性,尤其是unity中的表面着色器。
在Shader中,漫反射的组成部分基本上描述了光从表面向各个方向反射的方式。这和反光镜的工作原理很像。但它们是有区别的。反光镜是一个带有反光的表面,它其实反射的是周围的环境图。但漫反射光照是把所有的光从光源的位置,将光线反射回观察者的眼中,比如我们把太阳比作光源的位置。在后边的章节中会说到反射。 目前而言,目的只是为了区分一下两者。
为了实现一个基础漫射光照模型,我们需要创建一个着色器,并且里面需包含自发光颜色、环境光颜色以及所有光源累积的总和。下面会来演示并创建一个完整的漫反射光照模型,同时也展示了一些不同的行业技巧,比如只使用纹理来创建模拟更复杂的漫反射光照模型的方法。
最后,本章内容你将会学习到如何创建基础着色器的基本操作。凭借此知识点,你可以创建几乎任何表面着色器。
第1节. 创建基础表面着色器
当我们进一步深入到本书的内容时,需要对Unity软件的基础使用有所了解,这点很重要。它会大大提高你的制作效率。如果你在Unity中可以非常熟练的创建着色器和材质球,那么就可以跳过这一节。这节是专门为了让新手顺利学习本书接下来的内容而准备的。
1.1、准备工作
打开Unity引擎,开始以下内容。首先创建一个新工程。本书提供了一个Unity的工程文件,所以你可以直接使用这个工程,当完成每一步的着色器(Shader)编写以后,只需要把自己写的Shader添加上去即可。做完这些准备后,我们开始走进实时着色器的奇妙世界。
1.2、如何实现...
在第一个着色器开始之前,为了方便接下来的操作我们先创建一个小场景,创建完成后你可以在GameObject菜单中添加需要的游戏组件。这里我们创建一个平面(plane)作为地面,和几个球体(sphere)用来展示我们写好的shader的渲染效果。场景中再添加一盏平行光。准备完成后,我们开始进入着色器的编写步骤:
- 步骤1:在Unity编辑器的Project面板中,选择Assets文件夹,并右键单击选择Create | folder。如下图1.1所示:
图1.1
【 这里需要注意的是,Project面板的布局设置的是:两栏布局(Two Column Layout)。如下图1.2所示: 】
图1.2
【如果你使用的是本书自带的Unity项目,可以直接跳到第4步。】
- 步骤2:将新创建的文件夹命名为Shaders(这个文件夹用来装我们写的着色器—Shader)。选择文件夹单击右键,在下拉列表中选择Rename进行重命名。或者选择文件夹点击键盘上的F2键,也可以重命名。
- 步骤3:接下来再创建一个文件夹并将其命名为Materials(这个文件夹用来装材质球—Material)。如图1.3创建好了两个件夹并完成了重新命名:
图1.3
- 步骤4:选择Shaders文件夹右键单击,出现下拉菜单后,点击Create | Shader(意思是在Shaders文件夹中创建一个着色器文件)如图1.4所示。 然后选择 Materials文件夹,步骤同上继续右键单击,在下拉菜单中选择Create | Material(意思是在Materials文件夹中我们创建一个材质球)如图1.5所示。
图1.4
图1.5
- 步骤5:将着色器和材质球都重命名为BasicDiffuse。如图1.6所示:
图1.6
【 注意:在步骤6开始之前(即打开Shader文件前),我们需要配置一下代码环境,可以安装Visual Studio Code(简称VSCode)或者Visual Studio。安装好之后在顶部菜单栏中单击Edit菜单选择Preferences | External Tools,在External Script Editor的下拉菜单中选择你所安装的代码配置环境的软件,如下图安装的是Visual Studio Code。图1.7是Unity2018版本里面的设置界面,图1.8是Unity2021版本里面的设置界面,这里就不展示更早期Unity的设置界面了。】
图1.7
图1.8
- 步骤6:这时我们就可以双击BasicDiffuse.shader打开Shader文件了,现在就可以显示Shader的代码了。(在早期老的Unity版本中如果不配置代码环境,双击shader文件时,Unity会使用默认脚本编辑器MonoDevelop打开,在这里我们使用的是外部配置代码环境)。VSCode安装包下载地址:【免费】VSCode安装包(VSCodeUserSetup-x64)资源-CSDN文库
【 打开着色器(Shader)文件后,你会看到Shader中有默认的代码,这是Unity中自带的。 在默认的Shader里会自带一个基础的漫反射光照模型并且还计算了一个纹理采样。我们会基于这个代码来学习,在它的基础上进行修改调整,快速开发成为自己的自定义着色器。】
- 步骤7:下面给我们的着色器赋予一个在材质球中选中的文件路径。我们在Shder的第一行代码里修改它。目的是为了便于在材质球中的Shader下拉列表中快速找到它。 我们将Shader路径重命名为“CookbookShaders/BasicDiffuse”。(这个名字并不是一成不变的,你是可以随意修改它,因此不用担心任何的依赖关系)如下所示:
Shader "CookbookShaders/BasicDiffuse"
- 修改完成之后点击键盘上的Ctrl+S,保存着色器,回到Unity编辑器中。 当Unity识别到文件已经更新时,它会自动编译Shader。 这时你的着色器中的代码应该是如下所示的样子:
Shader "CookbookShaders/BasicDiffuse"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
- 步骤8:选择我们在步骤4中创建的名为BasicDiffuse的材质球,并查看它的Inspector面板。 从Shader下拉列表中,选择CookbookShaders | BasicDiffuse 如图1.9