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

Unity HDR颜色、基础颜色、强度强度、HDR面板Intensity之间的相互转换

目录

前言:

一、UnityHDR面板的规律

二、HDR与基础颜色转换,HDR强度获取,输入设置强度获取

1.基础色->HDR颜色

2.HDR颜色->基础色

3.获取HDR颜色在面板中的强度

 4.获取HDR颜色在面板设置输入时的强度


前言:

HDR(高动态范围成像),相比LDR(低动态范围成像)能够带来更好的画面效果,随着移动设备性能的提升,越来越多的设备都支持HDR模式。而在Unity中,如何在基础颜色以及HDR颜色之间相互转换,是这篇文章的主题。

一、UnityHDR面板的规律

上面有三张图,第一张是一张简单的红色HDR配置面板,第二张是我改变Intensity,HDR面板的数值,而第三张则是在我确认输入Intensity后关闭面板再打开的HDR面板。

为什么最后确认输入打开的面板数值,和我设置看到的面板数值有不同了?

实际上,Unity在用户输入Intensity时和最终得到的intensity意义是有所不同的。它们之间做了一个转换与解压。

以下算法将会解答你的疑问。

二、HDR与基础颜色转换,HDR强度获取,输入设置强度获取

这个算法能帮助需要制作调色板功能的用户,对HDR颜色和基础色颜色之间进行自由操作。

1.基础色->HDR颜色

    //baseColor指代基础色,比如图1的红色(1,0,0,1)
    //intensity指代输入强度,比如图2输入的强度数值2
    internal static Color HDRColor(Color baseColor, float intensity)
    {
        return baseColor * Mathf.Pow(2f, intensity);
    }

很简单吧,基础色到HDR颜色,就是进行了一个Pow操作。

2.HDR颜色->基础色

     //其中hdrColor指代需要进行转换的HDR颜色,这个函数返回一个没有HDR的基础色
    //比如图3的hdr颜色数值(4,0,0,1),转换后就会得到图1的颜色数值(1,0,0,1)
    internal static Color32 DecomposeHdrColor(Color hdrColor)
    {
        Color32 baseColor = hdrColor;
        float maxColorComponent = hdrColor.maxColorComponent;
        if (maxColorComponent == 0f || (maxColorComponent <= 1f && maxColorComponent >= 0.003921569f))
        {
            baseColor.r = (byte)Mathf.RoundToInt(hdrColor.r * 255f);
            baseColor.g = (byte)Mathf.RoundToInt(hdrColor.g * 255f);
            baseColor.b = (byte)Mathf.RoundToInt(hdrColor.b * 255f);
        }
        else
        {
            float num = 255f / maxColorComponent;
            baseColor.r = Math.Min((byte)255, (byte)Mathf.CeilToInt(num * hdrColor.r));
            baseColor.g = Math.Min((byte)255, (byte)Mathf.CeilToInt(num * hdrColor.g));
            baseColor.b = Math.Min((byte)255, (byte)Mathf.CeilToInt(num * hdrColor.b));
        }
        return baseColor;
    }

3.获取HDR颜色在面板中的强度

//hdrColor就是需要进行获取的HDR颜色,此函数返回HDR颜色在编辑器中最终显示的强度
//比如图3的HDR颜色,它的强度在面板显示是2.416924,这个函数就会返回这个数值
internal static float GetHdrIntensity(Color hdrColor)
    {
        float maxColorComponent = hdrColor.maxColorComponent;
        if (maxColorComponent == 0f || (maxColorComponent <= 1f && maxColorComponent >= 0.003921569f))
        {
            return 0f;
        }
        else
        {
            float num = 191f / maxColorComponent;
            return Mathf.Log(255f / num) / Mathf.Log(2f);
        }
    }

 4.获取HDR颜色在面板设置输入时的强度

//hdrColor指代需要解压的HDR颜色,此函数返回在HDR颜色设置面板输入的强度
//比如图3,它的HDR颜色为(4,0,0,1),它返回的输入强度就是图2的输入强度2
 internal static float DecomposeHdrIntensity(Color hdrColor)
    {
        float maxColorComponent = hdrColor.maxColorComponent;
        if (maxColorComponent == 0f || (maxColorComponent <= 1f && maxColorComponent >= 0.003921569f))
        {
            return 0f;
        }
        else
        {
            float num = 255f / maxColorComponent;
            return Mathf.Log(255f / num) / Mathf.Log(2f);
        }
    }

以上便是HDR颜色与基础色之间的操作。

相关文章:

  • UDP协议 TCP协议(格式 超时重传 滑动窗口 拥塞控制...)
  • 如何收集 Kubernetes 集群的日志
  • 7V 至 30V 的超宽 VIN 输入范围,转换效率高达 96%的WD5030
  • Java中lombok的@Data注解【布尔类型】字段定义方式
  • 在使用 router-link 进行路由跳转时,A页面跳转到A页面,资源要重新加载吗
  • eBay日本站猫咪用品卖家数量激增60%,新机遇显现
  • Spring 无法解决循环依赖的 5 种场景
  • 嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)
  • Magento2根据图片文件包导入产品图片
  • 解决火绒启动时,报安全服务异常,无法保障计算机安全
  • 工具介绍《netcat》
  • 电脑如何拦截端口号,实现阻断访问?
  • 物联网设备数据割裂难题:基于OAuth2.0的分布式用户画像系统设计!格行代理是不是套路?2025有什么比较好的副业?低成本的创业好项目有哪些?
  • 股票交易所官方api接口有哪些?获取和使用需要满足什么条件
  • segment-anything分割万物python环境部署和实现
  • Seata:分布式事务的终极解决方案
  • vue3中插槽
  • ElementUI 级联选择器el-cascader启用选择任意一级选项,选中后关闭下拉框
  • 微服务的认识与拆分
  • 9.1go结构体
  • 网站建设申请报告怎么写/seo模板建站
  • 可以做产品宣传的网站/搜索引擎优化的内容
  • 给一个网站做需求分析/网络推广的工作好做吗
  • 网站建设设计工具/seo国外推广软件
  • asp做的网站后台怎么进去/百度关键词点击价格查询
  • 长沙响应式网站建设/长沙竞价优化