【《Unity 2018 Shaders and Effects Cookbook》翻译提炼】(三)法线贴图和透明材质

1.法线贴图

        3D模型的每个三角形都有一个面向方向,这是它指向的方向。它通常用放置在三角形中心的箭头表示,并且与表面正交。面对方向在光线反射到表面上的方式中起着重要作用。如果两个相邻的三角形朝着不同的方向,它们将以不同的角度反射光线,因此他妈妈将以不同的方式着色。对于弯曲物体,这是一个问题:显而易见的是,几何形状由平面三角形构成。

        为了避免这个问题,光线在三角形上反射的方式不考虑其面向方向,而是考虑其法线方向。如之前将纹理添加到shader所述,顶点可以存储数据,法线方向是UV数据后最常用的信息。法线是单位长度的向量(表示长度为1),表示顶点面向的方向。

         无论面向方向如何,三角形内的每个点都有自己的法线方向,即存储在其顶点的方向的线性插值。这使我们能够在低分辨率模型上伪造高分辨率几何体的效果。以下屏幕截图显示了使用不同的变种法线渲染的相同几何形状。在图像中,在左边,法线与其顶点表示的面正交;这表明每个表面之间有明显的分离。在右侧,法线沿着曲面进行插值,表明即使曲面粗糙,光线也应该反射为光滑。很容易看出,即使以下屏幕截图中的三个对象共享相同的几何体,它们也会以不同的方式反射光线。尽管由平面三角形构成,但右侧的物体反射的光线就好像它的表面实际上是弯曲的。

 

      具有粗糙边缘的平滑对象清楚的表明已经插入每顶点法线。如果我们绘制存储在每个顶点中的法线方向,可以看到这一点,如下面的屏幕截图所示。您应该注意,每个三角形只有三个法线,但由于多个三角形可以共享一个顶点,因此可以出现多个线条。

      从3D模型计算法线是一种快速下降的技术,有利于更先进的单法线贴图。与纹理映射相似,可以使用附加纹理提供法线方向,通常称为法线贴图或凹凸贴图。

      法线贴图通常是图像,其中图像的红色,绿色和蓝色通道用于指示法线方向的X,Y和Z分量。现在有很多方法可以创建法线贴图。一些应用程序,如CrazyBump和NDO Painter,将采用2D数据并为我们转换为法线数据。另一些应用程序如Zbrush4R7和AUTODESK将采用3D雕刻数据并为我们创建法线贴图。Unity使用UnpackNormals()函数在Surface Shader邻域中为shader添加法线的过程非常简单。

     a.创建一个名为NormalShader的Standard surface shader。

     b.创建一个名为NormalShaderMat的Material。

     c.打开shader,设置属性块,以获得颜色色调和纹理。

在这种情况下,绿色和alpha通道中有1个,红色和蓝色 有0,因此默认颜色为绿色,对于_NormalTex属性,我们使用2D类型,这意味着我们可以使用2D图像来指示每个像素将使用的内容。通过将纹理初始化为凹凸,我们告诉Unity,_NormalTex将包含法线贴图(有时也称凹凸贴图)。如果未设置纹理,则将替换未灰色纹理。使用的颜色(0.5,0.5,0.5,1),表示根本没有凸起。

      d.在SubShader{}模块,在CGPROGRAM模块,移走原有的_MainText,_Glossiness,Metallic,和_Color定义。然后,添加_NormalTex和_MainTint:

     

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        //把属性链接到CG程序
        sampler2D _NormalTex;
         float4 _MainTint;

        struct Input {
            float2 uv_MainTex;
        };
      e.我们需要确保用适当的变量名更新Input结构,以便我们可以将模型的UV用于法线贴图纹理

       struct Input {
            float2 uv_NormalTex;
        };

       f.最后,我们使用内置的unpackNormal()函数从法线贴图中提取法线信息,然后,你只需要应用这些新的法线到表面着色器的输出。

       g.保存脚本回到Unity Scene,然后我们把法线贴图放到Normal Map框里。(最后会有源码工程,法线贴图可到Texture里找)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值