解决Lightmap在PC上与ios和Android上表现不同的问题

简介:

Lightmap在PC上与android和ios的区别以及解决方法

1、 问题描述
相信很多人碰到过Lightmap的一些问题:
烘培好Lightmap之后,在PC上看起来相当给力,而打包成ios或android之后,就傻眼了,Lightmap往往就出现了改变,例如灯光曝光度不够、光照颜色偏冷色调、有时候甚至黄色光也能变成绿色光等等。
2、造成Lightmap在PC、ios和android上表现不同的原因。
在u3d里,Lightmap的格式是.exr(openEXR),exr格式的储存方式是使用4*16Bit RGBA来储存数据的,即是说,它使用四个通道分别为RGB和alpha,每个通道占16位储存空间,每个像素占48位储存空间来储存数据。所以EXR格式的图片颜色值域范围就达到了[-65504,65504],远大于8bit(颜色值域[0,255],用浮点数表示就是[0,1])格式所能储存的数值范围。
但是EXR格式的Lightmap打包成 android或ios之后,就变成LDR格式(可能是单通道8bit)的了,这就丢失的很多光照信息。例如在PC上烘培出的灯光亮度值是2000,转变成LDR格式后,亮度值就变成了255,这就是为什么打包成android或ios后灯光曝光度不够、光照颜色偏冷色调的原因。
3、 解决方法。
HDR有几种比较常见的编码格式,这里用的编码格式是LogLuv,就是将RGBA_FP32bit(每个通道32bit或16bit)的数据编码到RGBA32(每个通道8bit)的图片中。LogLuv算法几乎能100%还原unity切换平台后导致Lightmap丢掉的精度信息,算法如下:

//FP32(RGB) to LogLUV
fixed4 EncodeLogLuv(fixed3 vRGB)
{

   fixed3x3 M = fixed3x3(
       0.2209, 0.3390, 0.4184,
       0.1138, 0.6780, 0.7319,
       0.0102, 0.1130, 0.2969 );

   fixed4 vResult;
   fixed3 Xp_Y_XYZp = mul(vRGB, 

M);

   Xp_Y_XYZp = max(Xp_Y_XYZp, 

fixed3(1e-6, 1e-6, 1e-6));

   vResult.xy = Xp_Y_XYZp.xy / 

Xp_Y_XYZp.z;

   fixed Le = 2 * 

log2(Xp_Y_XYZp.y) + 127;

   vResult.w = frac(Le);
   vResult.z = (Le - 

(floor(vResult.w*255.0f)) / 255.0f) / 255.0f;

   return vResult;

}

//LogLuv to FP32(RGB)
fixed3 DecodeLogLuv(in fixed4 vLogLuv)
{

   fixed3x3 InverseM = fixed3x3(
      6.0014, -2.7008, -1.7996,
      -1.3320, 3.1029, -5.7721,
      0.3008, -1.0882, 5.6268 );

   fixed Le = vLogLuv.z * 255 + 

vLogLuv.w;

   fixed3 Xp_Y_XYZp;
   Xp_Y_XYZp.y = exp2((Le - 127) 

/ 2);

   Xp_Y_XYZp.z = Xp_Y_XYZp.y / 

vLogLuv.y;

   Xp_Y_XYZp.x = vLogLuv.x * 

Xp_Y_XYZp.z;

   fixed3 vRGB = mul(Xp_Y_XYZp, 

InverseM);

return max(vRGB, 0);
}
4、 实现步骤
1、 在PC平台烘培好光照贴图Lightmap_PC(.exr格式)。
2、 通过Lightmap_PC生成新的光照贴图Lightmap_LogLuv(.png格式,RGBA32bit,单通道是8bit)。生成过程就用上面提到的LogLuv算法进行编码。这里用GPU来进行生成,有类似GPGPU的思想。如下:

//用LogLuv算法生成的Lightmap输出到temp上,然后就将temp保存到一张.png格式的图片。

   public bool SaveRenderTextureToPNG(Texture inputTex,Shader outputShader, string contents, string pngName)

{

         RenderTexture temp = RenderTexture.GetTemporary(inputTex.width, inputTex.height, 0, RenderTextureFormat.ARGB32);
         Material mat = new Material(outputShader);
         Graphics.Blit(inputTex, temp, mat);
         bool ret = SaveRenderTextureToPNG(temp, contents,pngName);
         RenderTexture.ReleaseTemporary(temp);
         return ret;

   } 
    

//将RenderTexture保存成一张png图片

     public bool SaveRenderTextureToPNG(RenderTexture rt,string contents, string pngName)
     {
          RenderTexture prev = RenderTexture.active;
          RenderTexture.active = rt;

          Texture2D png = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false);
          png.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
          byte[] bytes = png.EncodeToPNG();

          if (!Directory.Exists(contents))
               Directory.CreateDirectory(contents);
          FileStream file = File.Open(contents + "/" + pngName + ".png", FileMode.Create);

          BinaryWriter writer = new BinaryWriter(file);
          writer.Write(bytes);
          file.Close();

          Texture2D.DestroyImmediate(png);
          png = null;

          RenderTexture.active = prev;

          return true;

     } 

3、 用新生成的光照贴图Lightmap_LogLuv替换原来的光照贴图Lightmap_PC。因为Lightmap_PC在切换android或ios会自动将Lightmap_PC压缩为LDR格式,这就丢失了精度。

http://www.ceeger.com/forum/read.php?tid=24457&fid=2
本文转自jiahuafu博客园博客,原文链接http://www.cnblogs.com/jiahuafu/p/7094772.html如需转载请自行联系原作者

jiahuafu

相关文章
|
4天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
4天前
|
安全 搜索推荐 Android开发
深入探索Android与iOS的系统架构差异
【10月更文挑战第29天】 在当今的智能手机市场中,Android和iOS无疑是两大主流操作系统。本文旨在深入探讨这两个系统的架构差异,从底层的操作系统设计到用户界面的呈现,以及它们如何影响了开发者和用户的体验。通过对比分析,我们可以更清晰地理解这两种平台的优势与局限,为开发者在选择开发平台时提供有价值的参考,同时也为用户选择设备提供一定的指导。
16 2
|
6天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
19 2
|
7天前
|
存储 搜索推荐 Android开发
安卓与iOS的较量:谁更胜一筹?
在当今智能手机市场中,安卓和iOS无疑是两大主流操作系统。它们各自拥有独特的优势和特点,吸引了大量用户。本文将从技术、用户体验、生态系统等方面对比分析安卓和iOS,以期为大家提供一个全面的认识。
|
10天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS的较量:选择最适合你的移动操作系统
在智能手机市场上,安卓和iOS一直是两大主流操作系统。本文将深入探讨这两个系统的优缺点,帮助你根据自己的需求做出最佳选择。
|
12天前
|
人工智能 Linux vr&ar
安卓与iOS的较量:一场永无止境的技术革新
【10月更文挑战第20天】 在移动操作系统的世界里,安卓和iOS一直是两大巨头,它们分别代表了开放与封闭、多样性与统一性的两种截然不同的哲学。本文将深入探讨这两个系统的起源、发展以及它们如何在不断的技术革新中保持竞争力,同时分析用户对它们的不同偏好背后的原因。
|
7天前
|
搜索推荐 安全 Android开发
安卓与iOS的对决:选择最适合你的操作系统
【10月更文挑战第26天】 在当今数字化时代,智能手机已成为我们生活中不可或缺的一部分。而在众多手机品牌中,安卓和iOS无疑是最受欢迎的两大操作系统。本文将深入探讨安卓和iOS的特点、优缺点以及适用场景,帮助你更好地了解这两个操作系统,从而做出更明智的选择。
11 1
|
11天前
|
搜索推荐 Android开发 iOS开发
安卓vs. iOS:操作系统的终极对决####
本文探讨了安卓和iOS两种主流移动操作系统的特点,从用户体验、系统生态、硬件兼容性等维度进行对比分析。通过深入浅出的方式,揭示了两者在技术层面的优劣及未来发展趋势,旨在帮助用户更好地理解并选择适合自己的平台。 ####
|
11天前
|
安全 搜索推荐 Android开发
Android vs. iOS:解锁智能手机操作系统的奥秘####
【10月更文挑战第21天】 在当今这个数字化时代,智能手机已成为我们生活中不可或缺的伙伴。本文旨在深入浅出地探讨两大主流操作系统——Android与iOS的核心差异、优势及未来趋势,帮助读者更好地理解这两个平台背后的技术哲学和用户体验设计。通过对比分析,揭示它们如何塑造了我们的数字生活方式,并展望未来可能的发展路径。无论您是技术爱好者还是普通用户,这篇文章都将带您走进一个充满创新与可能性的移动世界。 ####
20 3
|
12天前
|
安全 搜索推荐 Android开发
Android vs. iOS:一场永无止境的较量####
在智能手机操作系统领域,Android与iOS犹如两极,各自引领着不同的技术潮流和用户体验哲学。本文深入探讨了这两个平台的发展历程、核心优势、以及它们如何塑造了我们的数字生活,旨在为读者提供一个全面而客观的视角,理解这场持续多年的“战争”背后的真正意义。 ####