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
    }
  • 相关阅读:
    浅析CString内部实现机制
    ...sourceannotations.h(142) : error C3094: “repeatable”: 不允许匿名使用
    非MFC项目使用CString及如何打印
    GetTextExtentPoint32--获取字符串在屏幕上长度
    窄字符与宽字符相关的操作
    如何给图片添加黑色边框
    react native
    礼仪 习俗 文化
    职业 行业 2 博客
    读书 文摘 笔记 2 人生的支柱
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/9971651.html
Copyright © 2011-2022 走看看