且构网

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

《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色

更新时间:2021-08-08 03:08:51

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

1.7 创建渐变纹理来控制漫反射着色

在你的着色器编写工具箱里还有一个强大的工具——使用渐变纹理(ramp texture)来控制漫反射光照的颜色。这允许你突出表面的颜色,来模拟更多的反射光照或者其他高级的灯光设置。你可以在很多卡通风格的游戏中看到这种技术,通常在你想要更加艺术的画面效果,并且不需要很多真实物理模拟的光照模型时可以使用渐变纹理。
该技术在《军团要塞2》中流行起来,它也是由Valve提出来用于渲染他们的游戏角色。他们发表了一篇非常有名的白皮书,强烈建议你阅读一下。
这篇论文的白皮书讲解了《军团要塞2》中使用的光照和渲染技术。

1.7.1 准备工作
首先你需要用图像编辑软件创建一个渐变纹理,在这里我们使用Photoshop来制作一张特殊图片,不过不管哪个图像编辑软件都可以用来制作渐变纹理。
《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色

1.7.2 如何操作
让我们通过如下代码开启我们的着色器:
简单修改光照函数,添加如下代码:
《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色

执行上述代码,可以得到下图展示的效果:
《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色

1.7.3 实现原理

这行代码返回的是一个名为float3的颜色集,相当于r、g、b三个属性,这些颜色是通过tex2D的CG函数生成的。tex2D函数有两个参数,第一个参数是我们使用的纹理属性,第二个参数包含的是映射纹理的UV坐标。
在这种情况下我们并不需要使用顶点的UV值,而仅仅需要使用一个漫反射浮点值来映射到渐变图上的某一个颜色值。最终根据灯光计算后的方向来映射整个渐变纹理到物体的表面。
我们得到经过Half Lambert计算之后的新纹理映射值,并将之转换成float2()类型从而创建纹理索引值。当hLambert值为0时,tex2D函数会去搜索(0,0)UV坐标处的像素,在我们的示例里它会呈现渐变纹理中对应的蜜桃色,当值为1时,则会返回(1,1)UV坐标处的像素值,也就是白色。
现在,渲染艺术家们应该拥有了一些自定义方法来控制灯光在物体表面的效果了。这也就是为什么这项技术会经常出现在需要更多直观展示效果的项目当中。