• Unity shader with lightmap


    小记一下用法与问题,时更

    surface shader就不用操心了,自带lightmap计算

    主要是vertex fragment shader部分

    Unity5 bake light map有三种情况:

    1.Non-directional

    2.directional

    3.directional specular

     

     

    Non-directional

    这种计算最为简单,消耗也最少,

    注意不会烘焙上normal map的信息,只是模型顶点法线计算得的diffuse结果

     

    首先需要声明lightmap变量

    sampler2D unity_Lightmap;
    
    float4 unity_LightmapST;



    重复声明异常(unity 5.4),在UnityCG.cginc已经声明过了,就不用再声明

    需要在appdata中用一个新的坐标变量来计算lightmapuv,否则开始可能正确,但是博主在把模型generate lightmap uv后再烘焙,uv全部都是错的了。

            structappdata {
    
                float4vertex : POSITION;
    
                float4tangent : TANGENT;
    
                float3normal : NORMAL;
    
                float2texcoord : TEXCOORD0;
    
                float2texcoord2 : TEXCOORD1;
    
                fixed4color : COLOR;
    
            };



     

    然后vertex部分的struct声明(名字随意)

    float2 uv_lightmap : TEXCOORD1;

     

    vertex shader生成计算lightmap uv

    o.uv_lightmap =v.texcoord2.xy *unity_LightmapST.xy + unity_LightmapST.zw;



     

    在fragment shader中获取lightmap数据的方法,得到的是三元向量,如果未烘焙默认值为0:

    DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,i.uv_lightmap))



     

    判断是否烘焙,这样就可以分为两种算法,没有lightmap就实时算,有lightmap就用

            #ifdefLIGHTMAP_ON
    
    DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,i.uv_lightmap))。。。。lightmap相关计算
    
            #endif


    烘焙lightmap后,shader获取的阴影自阴影信息为1,光照方向为0(与光的Baking模式设置有关,realtime(有)/mixed(有)/baked(无))

     

     

    directional specular

    这种会产生两种lightmap,一种是带normal map的diffuse信息也就是普通的light map,一种是direction map也就是光照方向,我们可以使用烘焙的光照方向来计算specular及其他

     

    应该是这样可以得到direction map,但是博主试过会报错

     UNITY_SAMPLE_TEX2D_SAMPLER(unity_LightmapInd,unity_Lightmap,1);

     

     

     

     ---wolf96 2017/1/11

     

     

     

     

     

     

     

     

  • 相关阅读:
    gradle阿里云镜像配置
    tomcat相关
    Oracle通过SQL语句查看table所引用的对象(View/Function/Procedure/Trigger)
    C# 调用NPOI 修改Excel 完成实时更新公式结果
    SpringBoot2.1.6 整合CXF 实现Webservice
    SpringBoot中FreeMarker创建
    git回滚到指定commit
    idea push reject:push mater to origin/master was rejected by remote
    python读取文件
    python获取当前文件路径以及父文件路径
  • 原文地址:https://www.cnblogs.com/zhanlang96/p/6272317.html
Copyright © 2020-2023  润新知