东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

ebet真人咪牌

18897443015
新闻资讯
联系方式
全国服务热线: 18897443015

咨询热线:13960148351
联系人:杨波
地址:福州市江厝路70号

如何在Unity中从纹理生成法线映射?资讯科技新闻

来源:ebet真人咪牌   发布时间:2019-06-17   点击量:337

    本文主要介绍从纹理生成法向映射的基本方法,并在Unity中实现和测试。预备知识,法线映射和基础图形知识,基本向量和极限知识。二维纹理具有二维u和v,但实际上,高度(h)可以算作三维。有了高度,二维纹理可以想象成三维物体。考虑只有U方向可用的情况。如图所示,A和B是纹理中的两个点。UV坐标分别为(0,0)和(1,0)。上面的黑线表示点的相应高度。显然,只要求出某点U方向上的高度函数的切线,就可以得到垂直于它的法线。同样,V方向也是相同的。也就是说,如果你有纹理的高度信息,你可以计算纹理中每个像素的法线。因此,计算法线需要一个高度图,它表示与纹理中的每个点相对应的高度。但实际上,不需要求出每个纹理像素在UV方向上的法线,只需要求出在UV方向上的高度函数的切线,然后进行交叉积来计算相应的法线。如果没有高度图,也可以用灰度图像代替。灰度图像是对RGB三色分量进行加权平均。提取灰度值的算法很多。这里,使用基于人眼感知的常用灰度值提取公式。..r*0.2126..g*0.7152..b*0.0722。这个公式来源于人眼对不同颜色的不同敏感性。不需要计算太多,提取的灰度值可以直接作为高度值。当需要求出点函数像的切线时,只需要求出点函数的斜率,即导数,这需要在点附近计算。显然,两点越近,结果就越精确。所以这里有以下公式:在找到切线之后,我们得到两个方向上的切线向量之和。这种二维矢量形式的原因是,它们分别根据uoh平面和Voh平面计算,并且需要根据实际情况组合特定的矢量形式。在这里,我们可以进行优化。在导数公式中,我们进行除法,因为法线最终将归一化,所以切向量长度不影响交叉乘积后的结果向量的方向,所以实际上在计算导数时可以直接去除除法。下一步是做两个向量的交积。交叉积的次序会影响计算法线的方向,这应该根据实际情况来确定。此示例使用Unity Shader动态生成纹理中每个像素的法线图,并将其作为颜色输出。最后,在屏幕上将看到动态生成的法线图。将纹理放置在与屏幕平行的方向上,如下图所示:整个纹理在世界空间的XOY平面中,并且面向-Z轴(Unity使用左手坐标系,Z轴面向屏幕)。由于没有高度图,所以提取灰度值作为高度图。如上所述,该函数称为GetGray.。然后根据高度图的数值,计算出紫外光两个方向上的高度函数的切线。以上代码分为三个部分。前两部分计算紫外光各向的高度函数的切线,最后一部分计算最终的法线。看第一段,计算高度函数在U方向的切线。首先,确定步骤的大小。MainTexelSize是Unity着色器的内置变量,它保存与纹理大小相关的信息,并且是float4类型值(1/.、1/.、.、.)。DeltaScale是一个控制步长缩放的变量。在这种情况下,使用0.5乘以_DeltaScale来控制正常生成的精度。如前所述,大小越小,生成的正常值越精确。通常我们会对当前采样点的两侧进行采样,以获得更精确的结果。这种方法称为中心差分法。然后,可以根据步长取当前像素的左侧和右侧的高度值(在这种情况下,灰度值),并且根据上述计算方法计算切线。注释代码是原始代码,下面的未注释代码是优化代码,上面也提到过。一个问题是,为什么计算的切向量是(x,0,z)的形式,而不是其他。这是因为整个纹理在XOY平面中,并且高度是第三维度,因为u和V自然地根据X和Y轴方便地处理,所以高度h根据Z轴处理。另一个可能的问题是,当_DeltaScale特别小时,两边的像素实际上是单前沿像素,并且高度差为零。但实际上,这种情况只发生在采样和滤波模式是点采样时,其他数据可以参考如何处理特定的采样和滤波模式。类似地,在第二节中,我们可以计算垂直方向上的高度函数的切线,两个切线向量做交叉积,然后将它们归一化得到当前像素表面上的法线向量。交叉积的次序非常重要,因为纹理是朝向-Z轴的,所以法线一般会跟随表面的方向,这就是为什么交叉(切线,切线)而不是交叉(切线,切线)的原因。现在让我们来看一下作为颜色输出的法线。当然,它不能直接输出,因为法向量可能包含负值,并且可能看到黑色,所以我们需要转换它。这种转换对于已经知道法线映射的读者应该很熟悉。固定4色=正常*0.50.5。直接输出此颜色,如下图所示:它看起来与通常的法线映射略有不同,常见的是蓝色的。为什么它是蓝色的,因为普通的法线图是切空间。基于切空间中的法线映射,Z和B通道的值是0.5~1,而X和y、R和G通道的值是0~1,所以看起来更蓝,不是绝对的。上面计算的法线映射,由于交叉积的顺序,Z分量是面向-Z轴的,所以B通道是0到0.5,不相信可以使用截屏工具来查看颜色值。在这种情况下,通过将Z分量乘以-1,将法线映射转换为切空间非常简单。Nor.z*=-1;fixed4.=.*0.50.5。结果如下:根部的图像更蓝,但仍然不够蓝。这不是因为纹理特殊,而是因为仍然有一些校正步骤没有完成。当计算切向量时,直接使用高度差之和是不合理的,因为1024*1024尺寸图非常小,只有1/1024=0.00097656,但是高度差是0和1之间的差,例如高度0.6和高度0.2,比正常值大得多,从而导致切。线矢量非常接近-Z轴,并且计算的法线非常接近xoy平面,这使得它看起来非常红和绿,因为X和y具有更大的分量。为了解决这个问题,我们需要引入_HeightScale变量来控制高度差的比率。当_HeightScale的值为0.01时,法向映射结果如下:这个法向映射看起来是正常的,仔细观察表明每个砖块的上侧是绿色的,因为y对应于g,而右侧是红色的,因为x对应于R。伦斯方法,即像素两侧相邻的点,但只有在一个方向上彼此相邻的点与当前像素进行比较?这种方法一般不如中心差分法有效。除了高度差缩放,还有其他参数可以调整吗?是的,这里有两个简单的例子,因为修改非常简单,并且效果不适合这里提到的实例,所以本文没有实现它。凹凸值。画中的每一块砖都是凹的还是突出的?要改变这个属性,只需要调整法线xy的正负值,这将改变原始的凹凸方向。想象一下,你应该能够想出来。粗糙度:法向映射的粗糙度可以在原始法向映射的基础上进一步修改。事实上,前面的高度差缩放也是为了处理粗糙度,但是当您生成法线图时,您需要做额外的处理来修改它。也很简单。缩放法线中的XY分量并重新计算。法线是用于照明的,所以让我们试着在加入平行光后漫反射的效果,并将其与非法线映射(默认的法线方向是-Z轴)的效果进行比较。首先,没有法线映射。最后的结果显示在下图中:这是通过围绕x轴和Y轴旋转60度光源并使用默认法线获得的漫射结果。与没有光的原始图像相比,它有一个明暗的变化,但它仍然是一个平面图像。接下来是使用上述算法动态生成法线图。注意,正常。这里Z不再乘以-1,因为这个例子是在世界空间中计算的。通常,在切空间中它可能更有效,但这不是本文的内容。最终的输出结果如下图所示:可以看到整个画面具有明显的三维感,砖块也很粗糙,效果也大大提高。仔细观察就会发现,每个砖块都是在左侧和上侧照明,在右侧和下侧变暗,这与平行光的旋转角度相对应,所以照明结果是正确的。最后的工作是将生成的法线映射保存到硬盘。该步骤只需调用引擎的相关API即可将渲染的法线图作为资源保存,也可以直接在CPU上操作生成地图,但使用实时光照查看效果并不方便。

, 1, 0, 2);

相关产品

COPYRIGHTS©2017 ebet真人咪牌 ALL RIGHTS RESERVED 备案号:337