上次我们开始思考颜色,它们是由红、绿、蓝三色在 0 到 1 的范围内组合而成的。这节课我们终于要开始制作一个着色器了!不过别害怕,即使你不懂编程,也能做到!
现在我们已经了解了颜色,现在的知识已经足够了!打开我们之前创建的 Shaders 文件夹,右键单击,然后选择Create > Shader > Standard Surface Shader。暂时先不要管它。
前往“Claire”>“Materials”文件夹,创建一个新材质。我将其命名为“ClaireBody1”。
在层级视图(场景左上角的列表)中点击 Girl_Body_Geo,并将新材质拖到 Skinned Mesh Renderer 组件中。啊啊,她脸色变得像鬼一样白了!
展开材质属性部分,点击标有“标准”的“着色器”下拉菜单。点击“自定义”,然后点击“NewSurfaceShader”(或者你刚才创建的着色器的名称)。
材料属性现在应该看起来像这样。
现在让我们把纹理放回去!前往“Claire”>“Textures”文件夹,将名为“Girl01_diffuse”的纹理拖到“Albedo”栏中。Claire 现在看起来应该是这样的:
说实话,比以前更糟糕了。好吧,没关系,反正我们也要改变它的运作方式。回到我们新建的着色器,双击它,它会在 Visual Studio 中打开。你应该看到这个:
这次它自动打开了,但以前有时不会自动打开。如果 Visual Studio 没有自动打开,你可能需要自己打开它。如果是这种情况,请返回 Unity,右键单击 Assets 文件夹,然后选择“在资源管理器中显示”。在打开的窗口中,双击 .sln 文件,它应该会在 Visual Studio 中打开项目的代码部分。
好了,回到着色器代码,啊啊啊啊啊,这都是什么?别担心,就像生活中很多棘手的事情一样,我们只要忽略其中的大部分内容就能做得很好!事实上,这里面有很多我们现在根本不需要的东西,所以我帮你稍微整理了一下。你可以把现有的代码改成下图的样子,或者用附件里的内容替换掉。
稍后我会详细讲解这一切是如何运作的,但现在我们只关心结果,不关心为什么。看看“void surf”那部分。我把它叫做表面函数。
这是怎么回事?这里,o代表输出,它将包含克莱尔的显示效果信息。其中Albedo属性 ,正如我们之前所学,指的是模型的主色调。所以o.Albedo指的是克莱尔模型的主色调。o.Albedo 保存了红、绿、蓝三色的数值。
tex2D(_MainTex, IN.uv_MainTex)函数返回的是纹理的颜色,但它返回的不是三个数字,而是四个:红色、绿色、蓝色和 alpha 值。这里的 alpha 值指的是透明度,但我们现在不需要关心 alpha 值,因为 Albedo 只接受红色、绿色和蓝色。所以,当我们使用 tex2D(_MainTex, IN.uv_MainTex).rgb时,我们指的是我们只需要纹理中的红色、绿色和蓝色。_Color函数会将纹理的颜色与我们在颜色选择器中设置的颜色相乘。
好吧,我们稍微调整一下。我上次说过,当我们为纹理选择颜色时,纹理只能变暗,因为颜色值在 0 到 1 之间,任何小于 1 的值乘以它的值都会变小。所以,让我们看看如果我们用加法而不是乘法会发生什么!回到 Surface 函数,将 * _Color 改为 + _Color,如下所示。
但在 Unity 中生效之前,您必须先保存。如果您在 Visual Studio 中发现了未保存的更改,文件名选项卡上会显示星号,这样您就可以知道。
保存后,点击返回 Unity。现在,Claire 看起来如下:
单击白色方块内部以获取颜色并尝试其他颜色以查看会发生什么。
有趣的是,你会发现将颜色改为黑色会使克莱尔的表面颜色与纹理完全相同,即根本没有色调。
这是因为当我们添加颜色时,最小值就是我们开始的颜色。相比之下,当我们乘以颜色时,我们开始的颜色是最大值。因此,乘以颜色会使颜色变暗,而添加颜色会使颜色变亮。
将颜色设置回白色,这样我们就能更好地理解这个着色器的作用了。她看起来有点褪色了,你不觉得吗?嗯,如果我们能同时乘以颜色并添加颜色,那一定很酷。让我们回到着色器代码。找到顶部的属性部分,在以 _MainTex 开头的一行代码下方添加这行代码:_AddColor("Add Color", Color) = (0,0,0,1)。这样你的属性看起来就像这样:
这些是当您查看 Unity 中的材质组件时向您显示的属性!
现在转到 surf 函数正上方,定位到 Fixed4 _Color; 并在其正下方添加一行:Fixed4 _AddColor;
基本上,当您向属性添加新内容时,您必须在表面函数上方第二次添加它,我稍后会解释原因,现在只要知道这一点就行了。
回到表面函数,将 + 改回 *,然后在下一行输入 o.Albedo += _AddColor ;
+= 是“等于其本身加上另一个”的缩写,因此这与编写 o.Albedo = o.Albedo + _AddColor;
相同,如果这样更容易阅读。
最后,我们来修改一下这个着色器的名称。在最顶部,你会看到“Shader Xibanya/NewSurfaceShader”。这是着色器的路径,所以这个名称意味着,当我们展开材质组件中的着色器下拉菜单时,这个着色器将位于名为 Xibanya 的文件夹中,并且名为 NewSurfaceShader。将“NewSurfaceShader”部分改为“ColorAdd”后,整个着色器应该如下所示:
别忘了保存!
现在让我们回到 Unity。我们现在应该拥有以下的显示内容:
回到项目文件中着色器的位置,将其重命名为 ColorAdd,以免混淆。然后再次点击 Girl_Body_Geo,这样我们就可以调整颜色,看看能得到什么!(我已将ColorAdd 着色器的最终代码附加到本文,您也可以直接下载!)
你会注意到,添加颜色似乎对最暗的颜色(比如她的头发)效果最好,而叠加颜色几乎对最暗的颜色没有任何影响,但对最浅的颜色效果最好。先把这点小事留着以后再说吧。
为了在颜色上更有趣,我们可以调整一下定向光。在层级视图中单击定向光,将其颜色从默认的淡黄色更改为其他颜色。
嗯,我们来旋转一下,看看它在不同角度下的样子。旋转起来很简单,只需转到最顶部的“变换”组件,然后点击“旋转”行正中央的“Y”即可。现在该字段显示为 -30,点击字段旁边的“Y”,然后向左或向右拖动。这样可以旋转光源指向的罗盘方向,如果点击并拖动“旋转”行中的“X”,则可以改变光源向上或向下的程度。
看看光线如何根据其颜色和强度产生加法和乘法效果。我们稍后再讨论这个问题。现在,给自己一个赞,因为你刚刚完成了一个很棒的着色器!干得漂亮!把你的结果截图发到评论区给我,我想看看;如果你需要帮助或有任何问题,也可以联系我!