zoukankan      html  css  js  c++  java
  • 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----------------------------------------------------------

  • 相关阅读:
    逆向路由器固件之敏感信息泄露 Part2
    隐匿在iOS文件系统中的隐私信息
    使用Arduino模块实施无线信号的重放攻击
    逆向路由器固件之解包 Part1
    maven 多模块项目
    java中Map,List与Set的区别(转)
    mysql-开启慢查询&所有操作记录日志
    maven阿里云中央仓库
    yii2 RESTful api的详细使用
    Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)
  • 原文地址:https://www.cnblogs.com/2Yous/p/4225298.html
Copyright © 2011-2022 走看看