• Unity3D ShaderLab法线贴图


    Unity3D ShaderLab法线贴图

    说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图。将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果,

    同时也保持较低的多边形数。法线贴图通常存储在一个普通的rgb图片,他的rgb分量分别对应了曲面法线的xyz坐标。

    Unity中,会通过UnpackNormals()函数来使用法线贴图,这使得在表面着色范围内为我们的着色器添加使用法线的过程变得更容易。

    首先,创建一个shader和材质球。我们开始修改shader代码。

    1Properties中添加法线贴图

    Properties {
    
    _MainTint("Main Color",Color)=(1,1,1,1)
    
    _NormalTex ("Normal Map", 2D) = "bump" {}
    
    _NormalIntensity("Normal Intensity",Range(0,3))=0.2
    
    }

    2SubShader添加变量,修改Input结构体

    float4 _MainTint;
    
    sampler2D _NormalTex;
    
    float _NormalIntensity;
    
    struct Input {
    
    float2 uv_NormalTex;
    
    };

    3,修改surf函数

    void surf (Input IN, inout SurfaceOutput o) {
    
    //提取法线信息;
    
    float3 normalMap = UnpackNormal(tex2D(_NormalTex,IN.uv_NormalTex));
    
    normalMap = float3(normalMap.x * _NormalIntensity, normalMap.y * _NormalIntensity, normalMap.z);
    
    o.Normal = normalMap.rgb;
    
    o.Albedo = _MainTint.rgb;
    
    o.Alpha = _MainTint.a;
    
    }

     

    修改完毕,返回Unity中,添加贴图,设置Tiling值为10,效果如下:

     

     

    我们可以看到调整NormalIntensity可以明显改善法线贴图的法线强度。

    在上面我们用到了 UnpackNormals()函数,它是位于UnityCG.cginc文件中定义好的函数。

    通过它我们进行了贴图的法线运算处理,我们就可以利用返回值在光照函数中进行使用了。

     

    code start----------------------------------------------------------

     

     

    Shader "91YGame/Normal" {
        Properties {
            _MainTint("Main Color",Color)=(1,1,1,1)
            _NormalTex ("Normal Map", 2D) = "bump" {}
            _NormalIntensity("Normal Intensity",Range(0,3))=0.2
        }
        SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 200
            
            CGPROGRAM
            #pragma surface surf Lambert
    
            float4 _MainTint;
            sampler2D _NormalTex;
            float _NormalIntensity;
            struct Input {
                float2 uv_NormalTex;
            };
    
            void surf (Input IN, inout SurfaceOutput o) {
                //提取法线;
                float3 normalMap = UnpackNormal(tex2D(_NormalTex,IN.uv_NormalTex));
                normalMap = float3(normalMap.x * _NormalIntensity, normalMap.y * _NormalIntensity, normalMap.z);
                o.Normal = normalMap.rgb;
                o.Albedo = _MainTint.rgb;
                o.Alpha = _MainTint.a;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }

     



     

    code  end----------------------------------------------------------

  • 相关阅读:
    c中uint32转为string
    linux中查找某类文件中的特定字符串
    VMWare Workstation 无法连接外部设备
    Evernote(印象笔记)无法登录的问题
    Python request 在linux上持续并发发送HTTP请求遇到 Failed to establish a new connection: [Errno 11] Resource temporarily unavailable
    设计模式
    jquery-ui sortable 在拖动换位置时改变元素的大小导致占位与实际不一致
    Appium IOS 使用多模拟器并发执行测试
    Fiddler脚本修改Response数据
    android style和attr的用法
  • 原文地址:https://www.cnblogs.com/2Yous/p/4225298.html
Copyright © 2020-2023  润新知