zoukankan      html  css  js  c++  java
  • Diffuse贴图+Lightmap+Ambient

      shader里面光照计算毕竟还是比较复杂的,于是想到下面的性能相对好一些的方案。

      美术提供一张Diffuse贴图,一张lightmap贴图,然后在应用一个自定义的全局的环境光效果,来模拟静态的光照。

      每个模型单独提供自己的lightmap贴图,而不是使用场景烘焙出来的包含所有物体的liangmap,这样做的好处是比较灵活,同一个物体在不同地方提供不同的lightmap贴图即可。

    Shader "James/Scene/Diffuse Lightmap"
    {
        Properties
        {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _Lightmap ("Light Map", 2D) = "white" {}
        }
        
        SubShader
        {
            Tags { "RenderType"="Opaque" "Queue"="Geometry" }
            LOD 200
            
            Pass
            {
                Tags { "LightMode"="ForwardBase" }
                Lighting Off
                
                CGPROGRAM
                #pragma fragmentoption ARB_precision_hint_fastest
                
                #pragma vertex vert
                #pragma fragment frag
                #pragma multi_compile_fog
                
                #include "UnityCG.cginc"
                #include "JamesLighting.cginc"
    
                uniform sampler2D _MainTex;
                uniform half4 _MainTex_ST;
    
                UNITY_DECLARE_TEX2D(_Lightmap);
    
                struct vertexIN_base
                {
                    float4 vertex : POSITION;
                    float3 normal : NORMAL;
                    float2 texcoord : TEXCOORD0;
                    float2 uv2 : TEXCOORD1;
                };
                
                struct v2f_base
                {
                    float4 pos : SV_POSITION;
                    half4  uv : TEXCOORD0;
                    UNITY_FOG_COORDS(1)
                };
    
                inline half3 JamesDecodeLightmapDoubleLDR( half4 color)
                {
                    #if defined(UNITY_COLORSPACE_GAMMA)
                        return color.rgb * 2;
                    #else
                        return color.rgb * 4.59;
                    #endif
                }
    
                v2f_base vert(vertexIN_base v)
                {
                    v2f_base o;
                    o.pos = UnityObjectToClipPos(v.vertex);
                    o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
                    o.uv.zw = v.uv2;
    
                    UNITY_TRANSFER_FOG(o,o.pos);
                    return o; 
                }
                
                fixed4 frag(v2f_base i) : COLOR
                {
                    half4 bakedColorTex = UNITY_SAMPLE_TEX2D(_Lightmap, i.uv.zw);
                    half3 bakedColor = JamesDecodeLightmapDoubleLDR(bakedColorTex);
    
                    half4 mainColor = tex2D(_MainTex, i.uv.xy);
                    half4 clr = mainColor;
                    clr.rgb *= bakedColor + (AMBIENT_COLOR).rgb;
    
                    UNITY_APPLY_FOG(i.fogCoord,clr);
    
                    return clr;
                }
                ENDCG
            }
        }
        FallBack Off
    }
  • 相关阅读:
    让你一分钟认识电子身份验证系统EID
    jQuery滑动导航菜单
    sql语句中left join、 inner join的使用
    MySQL数据库分表的3种方法
    Apache 配置多端口 多虚拟主机 局域网访问
    8个开发必备的PHP功能(转)
    CentOS 6.4 图文安装教…
    mysql中char与varchar的区别分析
    PHP+jQuery+Ajax实现用户登录与退…
    隐藏/显示 我的电脑盘符驱动…
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/9971651.html
Copyright © 2011-2022 走看看