Unity 版本:2020.3.24f1
Unity烘焙插件:Bakery

使用Bakery烘焙场景后,得到场景光照贴图.hdr文件

问题分析:

1、unity shader在使用hdr文件时,获取的颜色值是会存在>1的情况,转成png之后,png中的值都是小于1的,所以导出的png文件在unity使用超过1的部分将会变暗。

2、光照贴图是Lightmap类型,直接获取的像素并保存为png图(颜色相差较大,且多出了alpha通道)

3、将光照贴图改为Default类型,直接获取的像素并保存为png图(颜色值与hdr在unity显示一样,且没有多出alpha通道)

4、那是不是意味着上图png可以作为光照贴图在项目中使用呢,答案是不行,由于渲染颜色值的限制(r.g.b<=1,大于1的部分按1显示),hdr图虽然与上图看到的像素值是一致的,但是hdr在shader中使用时的颜色值将会>1。

fixed4 col = tex2D(_MainTex, i.uv);
//col.rgb /= 8.0f;fixed maxV = max(col.r, col.g);
maxV = max(maxV, col.b);
if (maxV > 1.0f)
{return fixed4(1.0f, 0.0f, 0.0f, 1.0f);
}
return col;

5、上图左边使用的是hdr,右边使用的是png ,shader的作用是将纹理中像素大于1的部分标红;可以看到作用使用hdr的纹理是存在超过1的情况,而右边png则没有;

6、shader中使用光照贴图是采用相乘处理的(mainTextureColor.rgb * lightmapColor.rgb),因此使用png纹理,在高光部分(超过1)的最终颜色值必然会小于左边使用hdr纹理的最终颜色值。

7、那问题改如何解决呢! 既然hdr纹理在shader中会>1,而png必然是<=1的,那我们可以将hdr的颜色值也限定在0-1之内,并将缩放值存储在a通道中

Shader "Unlit/SaveHdr"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Scale("Scale value",Range(0.1,8.0)) = 8.0_AddRange("AddRange",float) = 0.01}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;float _Scale;float _AddRange;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);fixed maxV = max(col.r, col.g);maxV = max(maxV, col.b);maxV += _AddRange;if (maxV > 1.0f){col.rgb /= maxV;col.a = 1 / maxV;}//col.a /= 8;return col;}ENDCG}}
}

8、导出的纹理到了A通道,像素都是<1,a通道存的是1/maxV

9、项目中使用png纹理需要,将rgb / a,就能得到hdr中超过1的值了

#if _LIGHTMAPcolor.rgb = lightMap.rgb * color.rgb / lightMap.a  ;
#endif

10、以下是压缩hdr纹理的部分代码

public static Texture2D getTexture2D(string object_name){Texture2D lightmapFar = LightmapSettings.lightmaps[lightmapIndex].lightmapColor;string assetName = "Assets/"+ftRenderLightmap.outputPath+"/" + lightmapFar.name + ".hdr";TextureImporter textureImporter = AssetImporter.GetAtPath (assetName) as TextureImporter;TextureImporterSettings settings = new TextureImporterSettings ();textureImporter.ReadTextureSettings (settings);textureImporter.textureType = TextureImporterType.Default;textureImporter.isReadable = true;AssetDatabase.ImportAsset(assetName);var lightPng1 = AssetDatabase.LoadAssetAtPath<Texture2D>(assetName);var lightPng = RenderImage(lightPng1);RenderTexture.active = lightPng;Texture2D tex = new Texture2D (lightPng.width, lightPng.height, TextureFormat.ARGB32, false);tex.alphaIsTransparency = true;tex.ReadPixels(new Rect(0, 0, lightPng.width, lightPng.height), 0, 0);tex.Apply ();return tex;}private static RenderTexture RenderImage(Texture2D source){RenderTexture destination = new RenderTexture(source.width, source.height, 0);Shader sd = Shader.Find("Unlit/SaveHdr");Material mt = new Material(sd);mt.SetTexture("_MainTex", source);Graphics.Blit(source, destination, mt);return destination;}

11、左边是png异常情况,右边是png正常情况

Unity 光照贴图.hdr转.png解决方案相关推荐

  1. Unity教程之-Unity光照贴图Lightmapping

    一直没有光照贴图的深入了解,只知道它与灯光比起可以降低drawCall,偶然看到一本外文书上有详细的资料,这里学习并分享一下,下面开始! 一:简要说明一下Unity光照贴图的概念 翻译会有各种偏差,这 ...

  2. 第二十二章 Unity 光照贴图

    光照贴图过程将预先计算场景中静态物体表面的亮度,并将结果存储在称为"光照贴图"的纹理中供以后使用.光照贴图可以包含直接光照和间接光照,以及阴影效果.但是,烘焙到光照贴图中的数据无法 ...

  3. Unity光照贴图丢失的坑

    如需转载请注明出处 最近项目出版本的时候出现了部分建筑光照贴图不正常的情况,而且仅仅是部分模型,这部分模型都是有多个场景会用到的,所以都是单独出来打包的.然后以为是模型上面的光照信息丢失了,通过测试, ...

  4. Unity 光照贴图切换失效的问题2018

    变更光照贴图的写法 我们使用LightmapSettings.lightmaps设置场景中的光照贴图的信息.LightmapSetting的结构如下: [NativeHeader("Runt ...

  5. Unity光照贴图的切换,实现黑夜和白天效果

    有这么一个需求,不能使用实时光来进行动态控制光照开关,但是又要实现白天和黑夜的效果,我的场景中有大概十几个点光源和平行光 实现步骤: 一.模型原模原样复制到另一个场景中(因为贴图只能存在于当前的场景文 ...

  6. (二)unity自带的着色器源码剖析之——————UnityCG.cginc文件(上篇:数学常数、颜色空间常数和函数、顶点布局格式结构体、进行空间变换的函数、HDR级光照贴图编解码相关函数等)

    一.数学常数 unity3D内置着色器定义了一系列的数学常数,如下: 从第3行开始,第13行结束: #ifndef UNITY_CG_INCLUDED #define UNITY_CG_INCLUDE ...

  7. unity 烘焙 光照贴图 以及一些灯光的相关问题(二)

    在上一篇了解了光照以及光照贴图的一些相关属性后,在这篇具体讲讲相关的使用,以及自己预见的一些坑. 首先还是在上一篇的场景基础上,我们隐藏Realtime和Mixed光源,只留Baked的光源用来进行场 ...

  8. Unity—GI光照贴图

    参考转载来源,unity全球官方网站&麦子学院魏知晓&Json_c: 什么是全局光照--Global Illumination/GI? 什么是光照贴图--LightMap? 什么是光照 ...

  9. Unity教程||Unity 渐进式光照贴图烘焙详解

    随着各大计算平台的算力稳步增长,特别是GPU技术的不断进化,原先可望而不可及的技术比如实时光线追踪技术开始逐步走入玩家的视野.一些先锋厂商甚至已经超出Demo的范畴,开始正式推出支持实时光追的游戏. ...

  10. Unity光照系统,GI,光线追踪,LightMap,Enlighten,HDR等

    GI:全局光照,指的是模拟光线是如何在场景中传播的算法.不仅会考虑直接光照的结果,还会计算光线被不同的物体表面反射产生的间接光照. Unity使用的是预计算实时全局光照 : 实时(直接光照)+ 预计算 ...

最新文章

  1. 在Paddle中利用AlexNet测试CIFAR10数据集合
  2. 安装NFS服务,并挂载到开发板
  3. CentOS 6下编译安装Nginx
  4. shell获取当前进程pid和上一个进程pid
  5. Qt状态机框架介绍(一)
  6. abv asp是静态网页吗_2019年seo动态网页优化“指南针”
  7. 四川大学计算机学院 期末考试安排,四川大学《计算机组成原理》2018期末考试B卷.doc...
  8. 注释标记的原则_它关系到平台如何标记操纵的媒体。 这是设计师应遵循的12条原则。
  9. 由逻辑异或运算符而发现的PHP诡异运算符优先级
  10. 如何点击打印,直接打印出来,不弹打印设置选项
  11. 这是自己的第一篇博客
  12. AtomicReference原子性引用
  13. linux内存源码分析 - 内存回收(整体流程)
  14. java get与post区别_POST和GET区别
  15. kasp技术原理_Massarray技术——中高通量大样本的SNP检测利器!
  16. canvas绘制图片时宽高2倍
  17. windows中家庭网络、工作网络、公用网络的作用及区别
  18. CRM和SCRM,到底有什么区别?
  19. LSTM+CNN模型厄尔尼诺事件预测
  20. IIS、Asp.net 编译时的临时文件路径

热门文章

  1. visa虚拟卡生成器_你们要的电子虚拟信用卡,它来了,准备好盘了吗?
  2. oracle财务软件中出纳用,财务软件中:“出纳签字”功能在会计核算中的作用及操作步骤?...
  3. 极路由大部分机型官方固件
  4. php用什么打开_php文件怎么打开,用什么软件打开php文件
  5. windows server 2008 R2 集成USB3.0驱动--成功实现
  6. VS2017 Visual Assist X破解方法
  7. 标签打印软件如何灵活调整打印方向
  8. Oracle数据库SQL优化详解
  9. Java视频文件上传
  10. Oracle之分析函数