当前位置: 首页 > news >正文

pc和android平台下lightmap的质量选取导致的宏变化

准备烘焙环境:
在这里插入图片描述
用standard的shader,进行烘焙。
在这里插入图片描述
使用高质量的lightmap编码,其实也即是对应HDR模式。RGBA16 sFloat
在这里插入图片描述
然后我们将一个物体的shader,换成下面的:

Shader "Unlit/SampleLightmap"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
			#pragma multi_compile _ LIGHTMAP_ON
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
				float2 uv2 : TEXCOORD1;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
				float2 lightmapUV : TEXCOORD1;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				o.lightmapUV = v.uv2.xy * unity_LightmapST.xy + unity_LightmapST.zw;
                return o;
            }

			inline half3 DecodeLightmap2(fixed4 color, half4 decodeInstructions)
			{
				#if defined(UNITY_LIGHTMAP_DLDR_ENCODING)
					return half3(1, 0, 0);
				#elif defined(UNITY_LIGHTMAP_RGBM_ENCODING)
					return half3(0, 1, 0);
				#else //defined(UNITY_LIGHTMAP_FULL_HDR)
					return half3(0, 0, 1);
				#endif
			}

			inline half3 DecodeLightmap2(fixed4 color)
			{
				return DecodeLightmap2(color, unity_Lightmap_HDR);
			}

            fixed4 frag (v2f i) : SV_Target
            {
				#if defined(LIGHTMAP_ON)
					half4 bakedColorTex = UNITY_SAMPLE_TEX2D(unity_Lightmap, i.lightmapUV.xy);
					half3 bakedColor = DecodeLightmap2(bakedColorTex);
					return fixed4(bakedColor, 1);
				#else
					return fixed4(0, 1, 0, 1);
				#endif
            }
            ENDCG
        }
    }
}

在这里插入图片描述
在这里插入图片描述
走到了这里:

inline half3 DecodeLightmap2(fixed4 color, half4 decodeInstructions)
{
	#if defined(UNITY_LIGHTMAP_DLDR_ENCODING)
		return half3(1, 0, 0);
	#elif defined(UNITY_LIGHTMAP_RGBM_ENCODING)
		return half3(0, 1, 0);
	#else //defined(UNITY_LIGHTMAP_FULL_HDR)
		return half3(0, 0, 1); //高质量模式,走到了这里
	#endif
}

换个模式:Low Quality
在这里插入图片描述
此时贴图格式变为:RGBA8 sRGB格式
在这里插入图片描述
在这里插入图片描述
此时走到:

inline half3 DecodeLightmap2(fixed4 color, half4 decodeInstructions)
{
	#if defined(UNITY_LIGHTMAP_DLDR_ENCODING)
		return half3(1, 0, 0);
	#elif defined(UNITY_LIGHTMAP_RGBM_ENCODING)
		return half3(0, 1, 0); //低质量走到了这里:Low Quality
	#else //defined(UNITY_LIGHTMAP_FULL_HDR)
		return half3(0, 0, 1);
	#endif
}

下面换成Normal Quality试试:
在这里插入图片描述
没变化,也就是收pc下只用了:UNITY_LIGHTMAP_RGBM_ENCODING和UNITY_LIGHTMAP_FULL_HDR
前者对应得是Low/Normal Quality后者对应的是High Quality。

在官方文档中:https://docs.unity3d.com/Manual/Lightmaps-TechnicalInformation.html
Choosing High Quality will enable HDR
lightmap support, whereas Normal Quality will switch to using RGBM encoding. Low Quality will switch to dLDR encoding on mobile platforms, on other platforms it is equivalent to Normal Quality.
这里对于pc平台下,只有HDR和RGBM两种模式,不会用到dLDR。

假如我们使用的是低质量或者是normal quality:则是打开了宏:UNITY_LIGHTMAP_RGBM_ENCODING
看下unity自己的UnityCG.cginc中的:

inline half3 DecodeLightmap( fixed4 color, half4 decodeInstructions)
{
#if defined(UNITY_LIGHTMAP_DLDR_ENCODING)
    return DecodeLightmapDoubleLDR(color, decodeInstructions);
#elif defined(UNITY_LIGHTMAP_RGBM_ENCODING)
    return DecodeLightmapRGBM(color, decodeInstructions);
#else //defined(UNITY_LIGHTMAP_FULL_HDR)
    return color.rgb;
#endif
}

我们将其移植到自己的shader中:

inline half3 DecodeLightmap2(fixed4 color, half4 decodeInstructions)
{
	#if defined(UNITY_LIGHTMAP_DLDR_ENCODING)
		return half3(1, 0, 0);
	#elif defined(UNITY_LIGHTMAP_RGBM_ENCODING)
		return DecodeLightmapRGBM(color, unity_Lightmap_HDR); //low/normal quality是这个宏
	#else //defined(UNITY_LIGHTMAP_FULL_HDR)
		return half3(0, 0, 1);
	#endif
}

打开帧调试器:
在这里插入图片描述
因为这里使用的是linear space,所以unity_Lightmap_HDR的x是5的2.2次方。
在这个博客中:https://blog.csdn.net/wodownload2/article/details/105114964
和https://docs.unity3d.com/Manual/Lightmaps-TechnicalInformation.html
中提到:
RGBM encoding. RGBM encoding stores a color in the RGB channels and a multiplier (M) in the alpha channel. The range of RGBM lightmaps goes from 0 to 34.49(52.2) in linear space, and from 0 to 5 in gamma space.
所以就对应起来了。

我们切换成gamma模式:
在这里插入图片描述
此时:unity_Lightmap_HDR变为如下:
在这里插入图片描述
如果切换成高质量:
在这里插入图片描述
在这里插入图片描述
此时,没有用到unity_Lightmap_HDR自动优化掉了。

inline half3 DecodeLightmap( fixed4 color, half4 decodeInstructions)
{
	#if defined(UNITY_LIGHTMAP_DLDR_ENCODING)
	    return DecodeLightmapDoubleLDR(color, decodeInstructions);
	#elif defined(UNITY_LIGHTMAP_RGBM_ENCODING)
	    return DecodeLightmapRGBM(color, decodeInstructions);
	#else //defined(UNITY_LIGHTMAP_FULL_HDR) //high quality走到了这里
	    return color.rgb;
	#endif
}

补充:
1、在pc平台下,即使切换到了Low Quality,也不会打开宏UNITY_LIGHTMAP_DLDR_ENCODING
只会有两个质量的选择:Normal Quality——》对应RGBM编码格式;以及High Quality——》对应HDR编码格式。选取了Low Quliaty——》对应的还是RGBM格式。

2、在切换到android平台下,那么三者都有对应的编码格式了:
Low Quliaty——》dLDR
Normal Quality——》对应RGBM编码格式
High Quality——》对应HDR编码格式

打包的时候,选择切换平台:
在这里插入图片描述

相关文章:

  • mac 笔记本编辑文本命令
  • SHADOWS_SCREEN宏打开的时机
  • swagger 如何在UI界面加入Authentication token值
  • unity屏幕空间阴影
  • UNITY_NO_SCREENSPACE_SHADOWS打开时机
  • mixed模式下烘焙shadowmask记录的数据
  • 第七章 数组实验
  • unity_OcclusionMaskSelector
  • unity_ShadowFadeCenterAndType
  • 人月神话阅读笔记02
  • unity 烘焙模式——baked indirect/shadow mask/distance shadowmask/subtractive模式的区别
  • 第七章学习小结
  • unity_worldtransformparams.w
  • vue使用install函数把组件做成插件方便全局调用
  • 地形shader分析
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Brief introduction of how to 'Call, Apply and Bind'
  • Centos6.8 使用rpm安装mysql5.7
  • GraphQL学习过程应该是这样的
  • Java,console输出实时的转向GUI textbox
  • Java多线程(4):使用线程池执行定时任务
  • Java小白进阶笔记(3)-初级面向对象
  • MySQL主从复制读写分离及奇怪的问题
  • React的组件模式
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 分布式事物理论与实践
  • 关于List、List?、ListObject的区别
  • 猴子数据域名防封接口降低小说被封的风险
  • 回流、重绘及其优化
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深度学习入门:10门免费线上课程推荐
  • 深入浏览器事件循环的本质
  • 深入浅出webpack学习(1)--核心概念
  • 小程序开发中的那些坑
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • 移动端高清、多屏适配方案
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (70min)字节暑假实习二面(已挂)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (分类)KNN算法- 参数调优
  • (七)理解angular中的module和injector,即依赖注入
  • (转)可以带来幸福的一本书
  • (转载)Linux 多线程条件变量同步
  • (轉貼) UML中文FAQ (OO) (UML)
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .apk 成为历史!
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET 8.0 中有哪些新的变化?