Unity Shader 入门(五)法线贴图

简介

法线贴图是凸凹贴图(Bump mapping)的一种常见应用,简单说就是在不增加模型多边形数量的前提下,通过渲染暗部和亮部的不同颜色深度,来为原来的贴图和模型增加视觉细节和真实效果。简单原理是在普通的贴图的基础上,再另外提供一张对应原来贴图的,可以表示渲染浓淡的贴图。将附加的表面凸凹的贴图于原贴图进行运算后,可以得到细节更加丰富立体的渲染效果。
大多数法线图是一张RGB贴图,其中红,绿,蓝三个通道分别表示由高度图转换而来的该点的法线指向:Nx、Ny、Nz。在其中绝大部分点的法线都指向z方向,因此图更偏向于蓝色。在shader进行处理时,我们将光照与该点的法线值进行点积后即可得到在该光线下应有的明暗特性,再将其应用到原图上,即可反应在一定光照环境下物体的凹凸关系了。

Shader "Demo/Diffuse Normal"{
    Properties{
        _MainTex("MainTex", 2D) = ""{}
        _NormalMap("NormalMap", 2D) = ""{}
    }
    SubShader{
        Tags{"RenderType"="Opaque"}
        LOD 200
        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        sampler2D _NormalMap;
        
        struct Input {
            float2 uv_MainTex;
            float2 uv_NormalMap;
        };

        void surf(Input IN, inout SurfaceOutput o) {
            half4 c = tex2D(_MainTex, IN.uv_MainTex);
            float3 normal = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));
            o.Albedo = c.rgb;
            o.Alpha = c.a;
            o.Normal = normal;
        }

        ENDCG
    }
    FallBack "Diffuse"
}

half3 normal = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));
UnpackNormal是定义在UnityCG.cginc文件中的方法。UnpackNormal接受一个fixed4的输入,并将其转换为所对应的法线值(fixed3)。在解包得到这个值之后,将其赋给输出的Normal,就可以参与到光线运算中完成接下来的渲染工作了。

对比图

图5-1.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于本系列这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unit...
    JumboWu阅读 1,597评论 0 2
  • 【引言】 上一篇谈到C4D的凹凸贴图及其应用。最后说道,在现实使用中,尤其是在游戏引擎中,很少有使用凹凸贴图...
    DIGITALMAN阅读 40,813评论 19 190
  • 我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在...
    自由的天空阅读 12,451评论 0 12
  • 我的工作不是卖车,而是帮客买车。 汽车销售人员的最终目的是把汽车销售出去。有些人一味地追求汽车销售技巧,但是好的销...
    LIXINmm阅读 236评论 0 0
  • 五色令人目盲,五音令人耳聋,五味令人口爽,驰骋畋猎,令人心发狂,难得之货,令人行妨(fáng)。 是以圣人为腹不为...
    瀚海侯阅读 2,939评论 3 2