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

图形 2.7 LDR与HDR

LDR与HDR

B站视频:图形 2.7 LDR与HDR

文章目录

  • LDR与HDR
  • 基本概念
  • LDR
  • HDR
    • 为什么需要HDR
    • 不同显示屏的差异
  • Unity中的HDR
    • Camera HDR 设置
    • Lightmap HDR设置
    • 拾色器 HDR设置
    • 优缺点
  • HDR与Bloom
    • 通常Bloom渲染步骤
      • 渲染出原图
      • 获取图像中较亮部分
      • 高斯模糊
      • 叠加
    • Unity中Bloom渲染步骤
  • HDR与Tonemapping
    • ACES
    • LUT
  • 其他参考资料

基本概念

HDR: High Dynamic Range,高动态范围

LDR: Low Dynamic Range,低动态范围

动态范围(Dynamic Range) = 最高亮度 / 最低亮度

LDR

2.7_1

  • 8位精度(256精度);
  • 单通道 0-1;
  • 常用LDR图片储存格式:jpg、png、tga等;
  • 拾色器、一般的图片、电脑屏幕。

HDR

2.7_3

2.7_2

  • 远高于8位精度;
  • 单通道可超过1;
  • 常用HDR图片储存格式:hdr、tif、exr、raw等;
  • HDRI、真实世界。

为什么需要HDR

  • **更好的色彩,更高的动态范围和更丰富的细节。**并且有效的防止画面过曝,超过亮度值1的色彩也能很好的表现,像素光亮度变得正常,视觉传达更加真实;

    2.7_4

  • HDR才有超过1的数值,才有光晕(bloom)的效果,高质量的bloom能体现画面的渲染品质;

    2.7_5

不同显示屏的差异

市场上的不同显示屏,它们由于不同的厂家以及不同的实现工艺手法,它们的实际亮度(物理亮度)不统一的。以LDR来说,LDR范围为[0, 1],对应到不同屏幕上时,由于显示屏的亮度、强度不一致,就需要进行对应的匹配,也就是说匹配当前屏幕最低亮度0最高亮度1的范围,这一步骤由各自厂家完成。

Unity中的HDR

Camera HDR 设置

2.7_6

  • 场景将渲染为HDR图像缓冲区;
  • 屏幕后处理:Bloom & Tonemapping;
  • Tonemapping中完成转化:HDR -> LDR;
  • LDR图像发送给显示器。

Lightmap HDR设置

2.7_7

  • 选择High Quality将启用HDR光照贴图支持,而Normal Quality将切换为使用RGBM编码
  • RGBM编码:将颜色存储在RGB通道中,将乘数(M)存在Alpha通道中。

拾色器 HDR设置

2.7_8

  • 使用Intensity滑动条可以调整颜色的强度;
  • 滑动条每增加1,提供的光亮增加一倍
  • 在Shader中的属性栏内,目标颜色添加[HDR]标签。
Properties
{[HDR]_Color ("Color", Color) = (1,1,1,1)
}

优缺点

优点

  • 画面中亮度超过1的部分不会被截为1,增加亮部的细节并且减少曝光;
  • 减少画面较暗部分的色阶;
  • 更好地支持Bloom效果。

缺点

  • 渲染速度较慢(增加了Tonemapping步骤),需要更多的显存;
  • 不支持硬件抗锯齿;
  • 部分手机不支持。

HDR与Bloom

2.7_9

通常Bloom渲染步骤

渲染出原图

2.7_10

获取图像中较亮部分

从原图提取出超出阈值的高亮部分。

2.7_11

高斯模糊

对提取出的高亮部分进行高斯模糊

2.7_12

叠加

将高斯模糊后的高亮部分和原图进行叠加,得出最终效果。

2.7_13

Unity中Bloom渲染步骤

Unity实现Bloom效果和通常步骤不太一样。会在第一步先进行down sample(降采样,将原图分辨率减半)计算高光像素,然后根据down sample次数不断地进行降采样,并存到一张Render Texture中。次数到底后,再一步步up sample(升采样)回去。在up sample过程中,叠加之前相同次数的Render Texture。最终,回到原来的分辨率。

2.7_14

HDR与Tonemapping

在自然界中存在不同光源,不同光源的动态范围也不一样。例如蜡烛光的动态范围[10, 15](非真实值)、太阳光的动态范围[100000, 150000](非真实值),将这些动态范围转换到屏幕上可以看到的低动态范围,这个过程就叫做Tonemapping

2.7_15

  • 色调映射;
  • Tonemapping:把HDR转化为LDR;
  • 线性映射效果极差;
  • 把高亮区域和阴影区域中等亮度方向压缩 -> S曲线;

ACES

2.7_16

  • Academy Color Encoding System 学院颜色编码系统;
  • 最流行、最被广泛使用的Tonemapping 映射曲线;
  • 效果:对比度提高,很好地保留暗处和亮处的细节。

LUT

完整的ACES Tonemapping算法需要对每个像素做两次矩阵乘法以及两次多项式运算,如果在全屏后处理中使用,性能浪费较大。目前通行的优化方案是使用颜色查找表(Look Up Table, LUT),将每个像素颜色的计算过程转化为一次贴图采样。Unity中使用的Color LUT长这样:

2.7_17

Color LUT的具体使用步骤如下:

  1. 确定LUT使用的坐标空间,Unity使用的是Log C空间,该空间可以将[0, 59) 范围内的颜色值压缩到[0, 1];
  2. 选择LUT尺寸size,创建一张 size * (size * size) 大小的2D贴图;
  3. 逐个遍历像素,以uv坐标和尺寸换算到LUT空间坐标,再转换回线性空间颜色;
  4. 对线性空间颜色应用Tonemapping,结果写入像素对应uv处;
  5. 实际需要Tonemapping时,将输入线性空间颜色转换到LUT空间,再转换为uv坐标,采样LUT贴图,采样值作为最终结果;
  6. 也可以使用3D贴图,这样可以省去uv坐标转换的步骤;

使用Color LUT可以将对颜色的所有后处理全部整合到一起,因为不管多么复杂的计算,在实际应用时都转化成了一次采样。那么除了Tonemapping之外,其他诸如色相色温白平衡饱和度这样的调整统统都可以塞到一起去,这也就是为什么我们看Unity中生成LUT那个Shader里有一大堆参数了。

其他参考资料

Tone mapping进化论 - 知乎

【图形学基础拾遗】系统性理解颜色空间、HDR与Tonemapping - 知乎

相关文章:

图形 2.7 LDR与HDR

LDR与HDR B站视频:图形 2.7 LDR与HDR 文章目录 LDR与HDR基本概念LDRHDR为什么需要HDR不同显示屏的差异 Unity中的HDRCamera HDR 设置Lightmap HDR设置拾色器 HDR设置优缺点 HDR与Bloom通常Bloom渲染步骤渲染出原图获取图像中较亮部分高斯模糊叠加 Unity中Bloom渲染…...

DP动态规划基础题(Kadane算法)

动态规划(Dynamic Programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划算法通常用于优化问题,特别是那…...

[UnLua]动态创建SceneCapture2d相机,并且添加渲染目标纹理

在 Unlua 开发中,相机相关的操作是构建场景视觉效果的重要部分。以下我们来详细分析一段涉及相机实例化和为相机赋予纹理目标的 Unlua 代码。 -- 实例化相机local World self:GetWorld()maskCamera World:SpawnActor(UE.ASceneCapture2D)-- 给相机赋值纹理目标lo…...

【leetcode练习·二叉树】用「分解问题」思维解题 I

本文参考labuladong算法笔记[【强化练习】用「分解问题」思维解题 I | labuladong 的算法笔记] 105. 从前序与中序遍历序列构造二叉树 | 力扣 | LeetCode | 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵…...

【gitlab-ce】各组件介绍

主要组件功能接介绍(chatgpt回答的) nginx:作为Web服务器和反向代理,用于访问GitLab的Web界面。可以关闭,但会导致无法通过Web界面访问GitLab。prometheus_monitoring:提供监控和报警功能,收集和…...

PostgreSQL分区表:基础语法与运维实践

引言 简介:什么是数据库分区 数据库分区是一种将大型表物理上分割成多个较小的部分的技术。每个部分称为一个分区,这些分区可以分布在不同的存储设备上,以提高查询性能和管理效率。 为什么使用分区表 提高查询性能:通过减少需…...

Docker入门系列——DockerFile的使用

前面了解了Docker的基本概念,今天来认识一下DockerFile。 Dockerfile 是一个文本文件,包含一系列指令来组装 Docker 镜像。每个指令执行一个特定动作,例如安装包、复制文件或定义启动命令。正确使用 Dockerfile 指令对于构建高效容器至关重要…...

数据集平台分享

Kaggle: Your Machine Learning and Data Science CommunityKaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.https://www.kaggle.com/Kaggle 包含非常丰富的数据集和代码,…...

去地面算法——depth_clustering算法调试(1)

1 源码下载 论文: 《2016-Fast Range Image-Based Segmentation of Sparse 3D Laser Scans for Online Operation》 《2017-Efficient Online Segmentation for Sparse 3D Laser Scans》 代码:git链接 2 问题记录 2.1 无法找到qt问题 问题截图&…...

设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例

单一职责原理:(SRP) 面向对象七个基本原则之一 清晰的职责:每个类应该有一个明确的职责,避免将多个责任混合在一起。降低耦合:通过将不同的职责分开,可以降低类之间的耦合度,提高系统的灵活性。易于维护:当…...

HWA高速辅助驾驶系统组成及功能场景

HWA最基本功能包括智能跟车、拨杆变道、压速变道、车道居中保持等功能,有效减轻驾驶疲劳。随着智能驾驶不断走向成熟,HWA升级到高速自动驾驶HWP,可实现智能避让汇入口、智能避让大车、分心/疲劳监测、智能进出匝道、智能判别易混分叉路口、智…...

SpringMVC学习笔记(一)

一、SpringMVC的基本概念 (一)三层架构和MVC 1、三层架构概述 我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中&…...

kaggle 如何利用API下载数据集

首先 上传kaggle官网生成得 API 密钥: kaggle.json 文件。放到该代码同目录下,再运行一下代码。 注: 只需要修改下载竞赛数据集,就可以选择你的指定数据集。 jupyter文件运行 #首先 上传 kaggle.json 文件并设置 API 密钥 #再…...

第一个 Flutter 项目(1)共46节

前端开发工具vs code,安装Flutter sdk,如果你的下载速度比较慢,可以选择这个😄 flutter sdk 解压码:stwq 配置可以看这Flutter 新建工程一直等待 解决办法-CSDN博客 如果你是新的 Flutter 开发者,我们建…...

学术论文写作丨机器学习与深度学习

目录 第一章、ChatGPT-4o使用方法与技巧 第二章、ChatGPT-4o辅助文献检索、总结与分析 第三章、ChatGPT-4o辅助学术论文选题、创新点挖掘与实验方案设计 第四章、ChatGPT-4o辅助学术论文开题与大纲生成 第五章、ChatGPT-4o辅助学术论文写作马拉松活动介绍 第六章、ChatGP…...

导-4涉及的知识点

除了本课题,3D结构几何修复领域还有以下一些值得关注的研究: 1. **Poisson图像编辑**: 成功地将给定的纹理块融合到可能完全不同的背景图像上。 2. **张量投票(TV)框架**: - 讨论了使用张量投票框架进…...

从0开始深度学习(28)——序列模型

序列模型是指一类特别设计来处理序列数据的神经网络模型。序列数据指的是数据中的每个元素都有先后顺序,比如时间序列数据(股票价格、天气变化等)、自然语言文本(句子中的单词顺序)、语音信号等。 1 统计工具 前面介绍…...

vue2使用 <component> 标签动态渲染不同的表单组件

在后台管理系统中,涉及到大量表单信息的修改和新增。现在想对模板中代码做一些简单的优化。 1. 使用 v-for 循环简化表单项 可以将表单项的定义提取到一个数组中,然后使用 v-for 循环来生成这些表单项。这将减少重复代码,提高可维护性。 2…...

C#实现在windows上实现指定句柄窗口的指定窗口坐标点击鼠标左键和右键的详细情况

在Windows编程中,有时我们需要对特定窗口进行操作,比如模拟鼠标点击。这在自动化测试、脚本编写或某些特定应用程序的开发中尤为常见。本文将深入探讨如何在C#中实现对指定句柄窗口进行鼠标点击操作,包括左键和右键点击。我们会从理论背景开始…...

探索Python自动化新境界:Invoke库的神秘面纱

文章目录 **探索Python自动化新境界:Invoke库的神秘面纱**第一部分:背景介绍第二部分:Invoke库是什么?第三部分:如何安装Invoke库?第四部分:Invoke库函数使用方法1. 定义任务2. 执行任务3. 任务…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

Map相关知识

数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...