bump maps是何种贴图
如果你想从零开始学习Unity Shader的编程,那么这一系列文章将带你入门,即便你只是一个编程新手,也能轻松跟上。
在前文中,我们讲述了如何制作Cubemap,而现在,我们来深入探讨如何使用它。
让我们从最基础的Cubemap开始。它的核心在于使用texCUBE函数对Cubemap进行采样。你可能知道,通常第二个参数应该是UV坐标,但在Unity中,我们并不需要手动计算这个坐标。Unity已经为我们完成了这个计算,使用的是世界反射向量。
那么,这个由六图构成的Cubemap是如何映一个球体上的,使得球体看起来像是倒映着周围环境呢?
你可以将Cubemap想象成一个立方体,包裹着那个球体。从球心的位置发的射线穿过球体和立方体的表面,它们各自有一个交点。球面上的这个点,对应的就是立方体上那一点的纹理。如何计算这些点对应的UV坐标呢?其实,这些射线就是法线,它们指向的是立方体上离球体最近的那一面。举个例子,法线指向Z轴的那一面时,我们可以通过法线找到对应的点。计算UV坐标的方法与法线的其他两个坐标值有关。具体来说,对于球面上特殊的点,比如最顶点,其法线坐标(0,0,1)对应的是立方体的顶面的中点,其UV坐标是(0.5,0.5)。计算UV坐标的方法是(x/z×0.5+0.5, y/z×0.5+0.5)。这样的计算方式是将X、Y坐标投影到对应的面上,确保法线坐标的区间从[-1,1]变为[0,1]。
在Unity中,无需我们自己计算这些复杂的数值。我们可以通过使用内置变量worldRefl来直接检索Cubemap。简单来说,只是增加了法线贴图的功能而已。由于法线信息的改变,我们需要重新计算传入texCUBE函数的世界反射向量。而INTERNAL_DATA变量则用于存储原始的法线信息,在不需要时使用,例如使用了法线贴图时。根据新的法线信息,我们可以使用WorldReflectionVector函数来计算世界反射向量。
在游戏中,当物体从一个环境移动到另一个环境时,我们需要更换Cubemap来确保反射效果的真实性。有两种方法可以实现这一目的。第一种是实时更换Cubemap,虽然效果最真实,但对性能有一定要求;第二种方法是我们这里要介绍的方法,即在物体移动到新环境时更换Cubemap。
实现这一功能非常简单。在C#中,我们可以使用SetTexture方法来动态更换Cubemap。[ExecuteInEditMode]这个标签可以让脚本在编辑器状态下也能执行,无需点击Play调试,更加便捷。OnDrawGizmos函数则用于在Scene中绘制一些可视化元素以方便调试。CheckProbeDistance函数通过判断物体与A点、B点的距离来决定返回哪种Cubemap。在Update函数中设置材质的Cubemap即可。
关于Cubemap的效果展示,你可以想象一个金属球体配合特定的Cubemap所展现出的反射效果。"NormalCubemap"则是添加了法线贴图的版本。结合这两种技术可以创造出更加逼真的游戏场景和视觉效果。