32位HDR像素格式的制作方法

文档序号:17851879发布日期:2019-06-11 22:16阅读:597来源:国知局
32位HDR像素格式的制作方法

本公开总体上涉及高动态范围数字图像,并且更特别地涉及对高动态范围数字图像进行编码和变换。



背景技术:

随着基于物理的渲染和高动态范围(hdr)显示器的出现,计算机生成的图像质量正被推至新的水平。这种新水平的保真度要求针对经渲染的像素的宽范围和高精度:浮点格式。当前,实时hdr格式的标准是四个16位浮点值以表示图像的每个像素中的颜色信息,即64位hdr。64位hdr格式使用大量的存储器和带宽,因此特别地不适合于功率受限的设备。控制台游戏开发者以及其他人已经发现:为了从渲染管线获得最佳性能,必须做出对图像质量的折衷以便减小渲染目标的带宽和存储器需要。当前可用于现代gpu上的读取和写入的唯一32位hdr格式是r11g11b10。这是3通道颜色格式,包括用于每个颜色值(rgb)的具有5位阶码的浮点数。这表示与float16相同的范围但是具有大约一半的精度(6位用于红和绿,5位用于蓝对比10位用于float16)。因此,现有的32位hdr格式是不精确的。因此,可以对hdr图像格式做出改进。



技术实现要素:

本公开的说明性示例包括但不限于方法、系统和各种设备。在一个方面中,本文中描述了用于以硬件和/或软件对高动态范围(hdr)颜色数据结构进行编码、解码或其他处理的方法、系统和设备。在一个示例中,用于对像素数据编码的方法可以包括接收包括红、绿和蓝(rgb)值的像素数据。该方法还可以包括将所接收的像素数据变换为中间颜色空间数据,诸如经变换的cieayb空间数据。该方法还可以包括将中间颜色空间数据压缩成小于64位(诸如32位)。在一些方面中,32位可以被划分成亮度信息和色度信息,例如包括表示浮点亮度值的14位以及各自表示两个定点色度通道值的9位。

在另一示例中,用于对颜色数据解码的方法可以包括将luv颜色数据解包为中间颜色空间数据,其中该解包包括执行至少一个非线性操作。该方法还可以包括将中间颜色空间数据变换为rgb颜色值,以及输出rgb颜色值,例如以用于存储、渲染或一个或多个颜色修改操作。下面描述系统和方法的其他特征。

特征、功能和优点可以在各种示例中被独立地实现,或者可以在其他示例中被组合,其进一步细节可以参考以下描述和附图而看到。

附图说明

在下文中将参考附图更完整地描述本公开的实施例,在附图中:

图1描绘了用于显示图像或视频的示例计算系统。

图2描绘了可以由图形处理单元实施的示例图形管线。

图3描绘了cieluv颜色空间的色度图。

图4描绘了示例32位hdr像素数据结构。

图5描绘了u’v’颜色表示。

图6a、6b、6c、6d和6e描绘了比较相关的数字编码的精度或最大误差的曲线图。

图7描绘了用于使用32位hdr格式对像素数据编码的示例过程。

图8描绘了用于使用32位hdr格式对像素数据解码的示例过程。

图9描绘了本文中描述的技术可以被实现于其中的示例通用计算环境。

具体实施方式

本文中描述了用于以硬件和/或软件对hdr颜色数据结构进行编码、解码或其他处理的系统和技术。在一个示例中,hdr颜色数据结构或格式可以包括针对图像中的每个像素的32位颜色信息。该32位可以被划分成亮度信息以及色度信息。在一个具体示例中,14位可以表示亮度值,并且9位可以各自表示两个色度通道值,诸如u’和v’。在一些情况下,亮度值可以是浮点数,其中9位表示浮点值,并且5位表示阶码。在一些情况下,色度值中的每个可以是unorm值,或者被归一化到0与1之间的值的范围的固定小数点数。

在一些情况下,将诸如rgb数据的颜色数据编码成这种自定义格式可以包括将rgb数据变换为中间颜色空间。然后,从中间颜色空间,诸如ayb空间,颜色数据可以被压缩或转换为例如以32位表示的luv颜色值。对32位hdr颜色数据结构解码可以是编码过程的逆。在一些情况下,编码和/或解码过程的一个或多个步骤可以以硬件来执行(例如,硬编码),以实现在颜色信息仍然在gpu中被处理时对该颜色信息的操纵。在一些情况下,中间颜色空间可以是允许诸如颜色混合的线性数学操作被正确地执行的线性颜色空间。然而,luv颜色空间数据可能不具有与rgb颜色空间或中间颜色空间的线性关系,并且因此可能不会容易地经由像素或图像处理来组合或修改。鉴于这种限制,经压缩的数据结构可以例如通过硬件而被部分地解码为中间颜色空间以使各种图像或像素处理操作能够在数据上被执行,而无需将数据从渲染管线发送出去。

图1描绘了用于显示图像或视频的示例计算系统100。系统100可以包括计算设备102和显示器104,该系统100可以是一个集中的计算设备(诸如台式计算机、笔记本电脑、智能电话、平板电脑等)的一部分或者分布式计算系统,其中系统100的一个或多个部件可以通过一个或多个网络进行通信。计算设备102可以至少包括中央处理单元(cpu)106、gpu图形处理单元(gpu)108、以及存储器110,这些部件全部彼此通信。

在一些方面中,gpu108可以与cpu106部分地或完全地集成,或者可以是与cpu106不同且分离的物理部件(例如,在视频卡上或被嵌入在母板上等)。gpu108可以是专用电子电路,其被设计为快速地操纵并改变存储器以加速创建帧缓冲区中旨在用于输出到显示器的图像。gpu108可以具有实现并行处理大数据块的高度并行结构。gpu108对于执行与3d图形相关联的计算可以是特别有用的,该计算包括以下中的一个或多个:着色、变换、剪裁、打光、混合、滤波、编码、解码、扫描输出等。在一些方面中,这些计算或操作中的一个或多个可以由与gpu接口的(诸如在cpu106上执行的)软件来执行。在一些方面中,gpu108可以是促进图形渲染的处理单元。gpu108可以被用来高效地处理大量数据并行计算。gpu108可以被用来渲染图像、字形、动画和视频以供显示在计算设备100的显示屏104上。在一些方面中,(例如,视频卡上的)gpu108可以包括硬件存储器或访问硬件存储器。在一些实施方式中,可以采用作为(例如由cpu106使用的)系统存储器和(例如由gpu108使用的)视频存储器两者而起作用的(多个)存储器单元110。在其他方面中,作为(例如由cpu106使用的)系统存储器起作用的存储器单元与作为(例如由gpu108使用的)视频存储器起作用的存储器单元是分离的。如可以被理解的,在一些情况下,gpu108的功能可以由cpu106仿真。

为了实施图形管线,可以利用gpu108上的一个或多个着色器。着色器可以被认为是用于在图形数据上执行专用操作的gpu108的专用处理子单元或程序。着色器的示例包括顶点着色器、像素着色器和几何着色器。顶点着色器一般在顶点上操作,并且可以将位置、颜色和纹理坐标的计算应用到各个顶点。例如,顶点着色器可以在图形管线的存储器中指定的顶点的流上执行固定的或可编程的功能计算。着色器的另一示例是像素着色器。在一个示例中,顶点着色器的输出可以被传递到像素着色器,其转而在各个像素上操作。着色器的又一示例包括几何着色器。通常在顶点着色器之后被执行的几何着色器可以被用来从被发送到图形管线的开始的那些基元生成新的图形基元,诸如点、线和三角形。

由着色器执行的操作通常读取和/或写入一个或多个外部图形特定资源。这些资源的一些示例包括颜色缓冲区、深度缓冲区以及任意数据缓冲区。资源被分配图形存储器中的位置。在着色器推断出其操作之后,信息可以被放置在gpu缓冲区中。信息可以被呈现在附接的显示设备104上或者可以被发送回主机计算系统102以用于进一步操作。

gpu缓冲区提供gpu108上的存储位置,诸如图像、应用或其他资源信息的信息可以被存储于其中。当参考资源执行各种处理操作时,资源可以从gpu缓冲区被访问、改变并且然后被重新存储在缓冲区上。gpu缓冲区允许正被处理的资源在其由图形或计算管线变换时保留在gpu108上。因为将资源从gpu108转移到存储器110是耗时的,所以资源保留在gpu缓冲区上直到处理操作被完成可能是优选的。

gpu缓冲区还提供gpu108上的图形特定资源可以被定位于其中的位置。例如,资源可以被指定为具有特定格式(诸如像素格式)的特定大小的存储器块并且具有特定参数。为了使着色器使用资源,该着色器被绑定到图形管线中的“槽”。通过类比而非限制的方式,槽可以被认为是类似用于访问存储器中的特定资源的句柄。因此,可以通过指定该资源内的槽的数目和位置来访问来自槽的存储器。

在一个示例中,计算系统100可以接收图像数据112,其可以使用各种格式中的任何一种来编码,包括各种数据量等。计算设备102,并且更具体地是gpu108可以在图像数据112上执行一个或多个操作,并且之后变换图像数据12并以由显示器104可显示的格式将其渲染为图像数据114。在本文中,将图像数据112变换成经渲染的图像数据114的过程可以被称为图形或渲染管线。

图2描绘了可以由图形处理单元(诸如gpu108)实施的示例图形管线200。如下面将描述的,仅从高级别来描述示例管线200以提供用于讨论对针对颜色数据的自定义编码的处理的基础,该处理可以被执行或与扫描输出和片段处理器阶段相关)。图形管线非常适合于渲染过程,因为其允许gpu作为流处理器起作用,因为所有顶点和片段可以被认为是独立的。这允许管线的多个阶段在工作通过管线的时候被同时用于不同顶点或片段。除了对顶点和片段管线化之外,顶点和片段的独立性还允许图形处理器使用并行处理单元在管线的单个阶段中同时处理多个顶点或片段。

在一个示例中,图形管线200可以被映射到gpu的集成图形加速硬件上,使得到gpu的输入是以顶点的形式。这些顶点可以经历经由顶点处理器216的变换和/或每顶点的打光。此时,在管线中,自定义顶点着色器程序可以被用来在光栅化之前操纵3d顶点。一旦被变换并且照亮,顶点经历经由剪裁器218的剪裁以及经由扫描输出220的光栅化从而得到片段。然后,在最终像素值被输出到帧缓冲区以用于显示之前,可以经由片段处理器222在每个片段上运行第二自定义着色器程序。片段处理器/自定义着色器222可以被修改以在本文所描述的hdr颜色数据结构上执行各种功能,诸如读取、写入、混合、滤波、纹理化等。

所描述的hdr格式或颜色数据结构可以由图形或渲染管线200中的各种过程或操作来利用。hdr颜色数据结构可以表示非线性空间中的颜色信息,使得在完全压缩格式中,颜色信息可能不与其他颜色信息组合并且另外可以是不可变换的(滤波、混合、着色等)。hdr颜色数据结构可以被部分地解压缩或被解码成颜色的线性表示或线性颜色空间,使得其可以由各种图形过程来操作而无需完全解码。

在一些方面中,该部分解码操作可以由gpu本身/gpu内的硬件来执行,以实现固定功能alpha混合和纹理采样单元内的颜色值的线性校正混合和滤波。下面将描述到所描述的hdr颜色格式的精确变换的细节。

图3描绘了cieluv颜色空间300的色度图,其包含由人类视觉系统可感知的整个颜色谱。如本领域中已知的,cieluv是与各种rgb颜色空间不同但相关的颜色表示。例如,为了从rgb颜色空间转换到ayb空间,需要3x3矩阵乘法。如下面将更详细地描述的,为了从ayb空间转换为所描述的格式,需要另一变换或压缩。

编码或表示hdr颜色的一种方式是将亮度与色度分离。在一些方面中,仅亮度需要被编码有高动态范围(即,浮点数)。logluv格式通过将颜色变换为ayb然后计算下式来实现该技巧:

u'=4a/(a+15y+3b);以及

v'=9y/(a+15y+3b).

在此处停止,如图3所示,[y,u',v']形成颜色空间luv。

luv颜色空间中的u'和v'可以由从0.0到1.0的范围的值来呈现,但是由人类可感知的所有颜色存在于0.0至0.62范围内。基于该关系,u'和v'值可以除以0.62以使unorm空间的覆盖范围最大化,例如得到具有均匀分布的最大值,并且因此得到具有均匀分布的最高精度。颜色值的均匀分布可以提供具有被给出的值的范围的最可感知的差异,因此,其是期望的。ayb颜色空间中的亮度或y是具有其提供的所有范围的浮点数。logluv实际上获取y并将log2y编码为定点数,以将其分解成两个8位片段(技术上是s7.8)并且将整个颜色写入到r8g8b8a8_unorm。

经由实验,已经确定用于色度或色度值或u和v的16位几乎足以表达可感知的颜色的范围。然而,可以预想到使用8位用于每个u和v的梯度,该梯度呈现带状。另一方面,两个9位unorm已经被确定为具有足够的精度(8位unorm的两倍)以使颜色差异足够小以至于实际上不可感知到。这是可能的,因为在亮度与色度之间不存在相关并且还因为cieluv被设计为以感知上均匀的方式来分布颜色。如ypbpr的传统ycc编码不将色度与亮度解耦,并且因此需要所有三个通道中的尽可能高的精度。对log2()的使用也不是必需的,因为浮点数已经是针对阶码部分的对数编码。该问题的最后一点是不需要符号位,因此完整float16已经浪费一位。此外,如果尾数的最低有效位被四舍五入,则仅需要14位来表示色度,9e5或float14具有与float16一样大的范围以及几乎一样高的精度。其与两个9位unorm通道耦合形成32位。

在图4中图示的是上述颜色格式的示例。如本文中所使用的,用于表示像素的颜色的该格式或数据结构可以被称为l14u9v9、luv32或32位hdr格式。数据结构400可以包括像素数据402,其可以包括针对亮度信息404以及经由通道406和408的、可以对应于u和v颜色信息的色度信息的空间或分配。在一个示例中,亮度信息404可以被分配14位,l0-l8,其中5位表示阶码e0-e4。亮度信息404可以是浮点值,使得小数位可以在表示性的14位中不固定。小数点可以被固定在尾数的开始处(在隐式1之后)并且结果值可以乘以幅值或缩放因子,其将小数点左右移动(例如,值=(2.0**阶码)*(1.尾数))。在一些情况下,亮度值可以从10位值四舍五入,使得最低有效位被丢弃并且基于被丢弃的最低有效位来四舍五入l9。在一些情况下,还可以从亮度值404丢弃正或负的符号值,因为亮度也可以被假设为是非负数。以这种方式,14位可以被用来表示先前由16位表示的值,其中在精度(最低有效位)上仅稍微下降。

通过使用总共14位来表示或定义亮度404,18位可以保留用于表示色度信息406和408,同时仍然维持32位的总体大小。因此,9位各自可以被用来定义色度值u和v(c0-c8用于色度406和色度408中的每个)。以这种方式,512个颜色值可以可用于u和v中的每个。在图5中图示了使用9位各自用于u和v的颜色值的示例分布。

为了使l14u9v有用的格式,其需要是可渲染的。换言之,l14u9v9必须可用作渲染目标格式并支持alpha混合。在当前的硬件上,可以通过进行“手动编码和解码”以有限的方式来使用l14u9v9,但是其将被受限制于alpha混合和纹理滤波。换句话说,当前的硬件不能够在该32位hdr格式上执行alpha混合和纹理滤波。在一个示例中,以硬件的(例如,gpu的)可编程混合可以被用来支持l14u9v9的alpha混合。对于alpha混合,简单的方法将是将颜色一直解码回rgb,进行通常的混合,并且之后一直重新编码回luv。这是不必要的数学量,其可以通过仅解码到中间的线性数字空间来优化。

由于色度分量(u和v)不是线性投影,因此其不能被线性地插值。解决方案是将打包一直展开到3x3向量变换的输出(例如,如以上所提到的到ayb空间)。该向量仍然是线性的并且可以如同其是rgb一样被混合或滤波。遗憾的是,这导致每个解码(不是每个通道)一个倒数以及每个编码一个倒数。为了对四个值(双线性)滤波,可以计算四个倒数(例如,9位查找)。为了将其写回到存储器,需要另外一个倒数。

以下描述了中间颜色空间,因为其适用于线性混合。该中间空间仍然是线性的但是提供将整个颜色值打包为32位所需的三个项。

中间空间:a,y,b

[a,y,b']=矩阵*[r,g,b]

所有都可以被混合在该空间中,因为线性变换是仿射的,其得到又一线性空间。可以如下地执行将三个(线性)项压缩成luv32:

l=打包float14(y)

u=打包unorm9(a/b)

v=打包unorm9(a/b)

使该经压缩的颜色空间非线性并且因此不可混合的是除法操作。为了解压缩回线性空间,除法操作需要被反转,其要求另一除法(例如,倒数)。

y=解包float14(l)

b=y/解包unorm9(v)

a=解包unorm9(u)*b

现在,可以再次线性地混合所有。注意,仅需要一个倒数,但是推导b要求l和v通道两者,并且推导a需要所有三个通道。正是该“跨通道”数据共享在其他可渲染的像素格式之中缺少先例。

图6a、6b、6c、6d和6e描绘了不同颜色或像素格式之间的比较的曲线图。

r11g11b10_float

首先观察到关于r11g11b10不存在alpha通道。这立即引起关注,因为具有支持alpha混合的alpha通道被认为是有必要的。情况并非如此。在渲染像素时,alpha值可以总是从像素着色器输出,但是几乎没有算法要求目的像素具有alpha。通常,目的alpha用于两个图像的延迟合成。如果这是目标,则可以代替地使用辅助8位缓冲区。桌面窗口管理器(dwm)需要知道用于合成窗口(即,“扁平化层”)的表面的alpha,但是可以假设缺乏alpha通道的窗口是完全不透明的。通过移除alpha通道,可以实现16位的即时节省,但是48位格式当前不存在。

为了量化数字空间的精度,我们必须估计跨表示的最大误差。具有6位尾数的浮点数将具有值0.5与1.0之间的26步。其是2-7或7.8125x10-3的步长。当将其与利用步长随着每个离散值而增大的8位srgb渐变来编码0.5和1.0的值比较时,在0.5处的srgb步长近似为6.0x10-3并且在1.0附近处升高到9.0x10-3。该比较被图示在图6a中。

8位srgb被用作比较,因为其对于sdr(标准动态范围)内容已经“足够好”但是仍然可能呈现带状。因此,尽管r11g11b10对于hdr颜色具有足够的动态范围,但是其难以与针对sdr颜色的8位srgb一样好并且可能呈现带状。其劣于10位srgb、10位pq以及最终12位pq(其全部具有静态范围,即不是浮点数)。每个格式利用定点数编码从0.0到1.0的值但是应用用以将精度朝向0.0增高的曲线,在0.0处人眼最敏感。

r9g9b9e5_sharedexp

另一hdr颜色格式已经存在一段时间了,但是其出于两个主要原因被广泛忽略:不可能渲染为该格式(或与其alpha混合),并且尽管可以利用该格式来创建纹理,但是它们不能被块压缩,使得它们比bc6h压缩的纹理粗得多。

具有共享阶码的r9g9b9e5类似于r11g11b10,因为其对三个浮点数通道进行编码。然而,差别在于所有三个通道必须共享单个阶码值。折衷在于9位可用于表示每个通道。阶码可以被用来将像素的亮度控制为最近的2的幂,并且之后颜色由27位来确定并且根据亮度被细粒度调节。然而,关于该格式,不存在三个9e5浮点数(其将是42位)。浮点数具有在尾数之前的隐式的1.0+。这三个通道是unorm(0与1之间的无符号归一化数)。它们不具有隐式的1.0+并且必须使该位为显式(通过这种方式,最大的通道可以被指示)。因此,最大的通道(其确定阶码)实际上是8e5浮点数。关于8e5浮点数的精度是可接受的,但是其他两个通道甚至不是浮点数。最大通道仅将小数点固定到位,因此如果它们的自然阶码小得多,则它们的位被向右移出。

理解这种缺点的最简单的方式是忽略其动态范围,r9g9b9e5正是被线性地存储的三个9位unorm通道。对于编码sdr颜色,这劣于使用曲线来增高黑色的精度的srgb。线性地存储srgb颜色将要求每个通道大约12位。这里,仅9位是可用的。这可以是可接受的,因为深色将得到较小的共享阶码并且维持精度,但是当一个颜色通道比其他通道亮得多(诸如饱和的颜色)时,则较小通道的精度受损。误差通过阶码来确定。对此问题的一个解决方案是将srgb渐变应用到9位unorm通道中的每个。这使得精度至少与用于存储饱和的sdr颜色的8位srgb一样好,并且高动态范围仍然是可用的。由于计算srgb代价有点高并且9位查找表占据宝贵的硅基板,所以sqrt()可以被用来达到几乎相同效果(并且注意仅需要对9位的平方根估计)。

32hdr格式

图4的hdr数据结构可以与10位pq进行比较。9e5具有高动态范围,而pq是针对静态范围的。例如,通过pq,可以利用虚拟相机来渲染场景,其可能导致场景非常暗或非常亮。该输出可以被重新缩放或“暴露”给可显示的静态范围。因此,9e5需要具有与10位pq一样高的精度但是数量级更大的范围。pq被设计为编码0–10,000尼特的范围。通过5位阶码浮点数(e5),可以编码几乎高达216=65,535的值。例如,相同值可以被线性地编码,其中y=10,000被存储为值10000.0h。图6b图示了以下绘图:针对两种编码的以及用于比较的来自r11g11b10编码的6e5浮点数的步长。

如所图示的,6e5可以具有10位pq的几乎二倍的误差。在本文中也被称为float14的9e5浮点数基本上更精确。9e5浮点数具有处理(在现代视频游戏的需求内的)预先暴露的hdr值的动态范围。

(从图5c放大的)图6c和6d图示了14位浮点数与12位pq之间的比较,如所图示的,14位浮点数优于12位的非线性(并且代价高的)pq编码。假设该精度可以在整个渲染或图形管线中被维持,则l14u9v9可以被用在扫描输出操作中,使得针对hdr12的要求将被满足。

图6e绘制了上述数值表示的最大误差以用于比较。

因为luv颜色已经是不可知的颜色空间并且对rec.2020上面和之外的所有可见颜色进行编码,所以所描述的格式将支持宽色域。这可以通过在宽色域中创作并存储所有内容或者在显示之前将一些或所有颜色转换到更宽色域来完成。在颜色信息无论如何必须利用3x3矩阵来变换的情形中,将所描述的32位luv格式完全用于中间表面(以及所创作的内容)将不增加任何或最小计算成本。

除了具有针对亮度的高动态范围和精度并且能够编码宽色域颜色之外,还可以存在其他的优点来保持亮度与色度分离。关于色调映射应当使颜色饱和/去饱和还是应当仅在亮度上操作,仍存在争论。暴露、色调映射以及甚至对比度调节可以全部都仅在亮度通道上操作。涉及色调偏移和饱和度控制的颜色分级可以全部是色度上的2d操作。游戏引擎使用3d查找表进行颜色分级是常见的,但这要求低分辨率体积纹理。可能如果亮度在过程式颜色调节中不起作用,则2d纹理查找可以用于更佳效果。或者考虑到饱和正是朝向或远离白点的混合并且对比度是关于亮度的伽马函数,则可以在没有查找表的情况下获得简单化的图像控制。

图7描绘了用于利用中间颜色空间对像素数据进行编码的示例过程。在一些方面中,过程700可以被实施为将颜色数据编码成32位hdr图像格式或数据结构(例如,l14u9v9)。过程700可以由gpu(诸如gpu108)的一个或多个硬件部件、gpu管线200的一个或多个软件部件、在cpu106上执行的软件或其组合来执行。

过程700可以在操作702处开始,其中可以接收诸如以rgb格式的像素数据。像素数据可以在任何rgb定义的颜色空间(诸如srgb、rec.2020、rec.709以及其他)中。像素数据可以由gpu或具有集成的gpu功能的cu接收。gpu可以执行或不执行利用固定功能逻辑单元的、从rgb到中间空间的变换。对于固定功能alpha混合,gpu必须执行从中间空间到luv的最终转换并且压缩到32位。

接下来,在操作704处,像素数据可以被变换为中间颜色空间,诸如ayb空间或其变型。在一些情况下,中间空间可以是cieayb空间或其变型。在以上描述的示例中,操作704可以包括将rgb数据转换到由a、y、b经由如下关系定义的中间空间中:

[a,y,b]=矩阵*[r,g,b]

接下来,在操作706处,通过操作704产生的中间颜色空间数据可以是luv颜色数据或者可以被转换成luv颜色数据,例如可以包括少于64位(例如,如上所述的32位)的luv颜色数据。在一些情况下,操作706可以包括将中间颜色数据压缩到32位,该32位定义包括高动态范围的颜色。32位可以如以上参考图4的数据结构400所描述的而被分配。在其他情况下,位可以以其他方式来分配,诸如16位用于亮度并且8位各自用于u’和v’,以及其他配置。在一些情况下,操作706可以包括将三个(线性)项a、y、b压缩成luv32,诸如根据下式:

l=打包float14(y)

u=打包unorm9(a/b)

v=打包unorm9(y/b)

在将数据压缩为luv颜色数据后,过程700可以在708处结束,此时数据可以从gpu108和/或cpu106被传送到另一计算设备,(在显示设备104支持32位hdr颜色格式的情况下)被渲染到显示设备、被存储在计算设备102或gpu108的存储器中以用于之后的渲染或传送等。

在一些方面中,操作702、704和706中的一些或全部可以以硬件(例如通过gpu108)来执行。在其他方面中,操作702、704和706中的一个或多个可以以软件来执行,诸如通过可编程的着色器指令来执行。在一个示例中,用户可以写入(例如,具有rec.709基元的)rgb值,并且硬件可以将rgb值自动地变换为luv并将它们打包成32位格式,诸如数据结构400。在另一示例中,变换可以以软件来执行,并且打包/解包(压缩706)可以以硬件(例如,实施渲染管线200的gpu108)来执行。该选项可以使用最少的硅并且将避免将硬件捆绑到可能变得废弃或被弃用的颜色空间(例如,rec.709)。然而,因为源颜色空间正好确定使用什么3x3矩阵以转换到ayb空间,因此过程700在被硬件实施时可以被修改以支持其他颜色空间。例如,矩阵值可以是可编程的,但是与该矩阵的相乘可以在固定功能单元中进行。

通过利用过程700和/或hdr颜色数据结构400,可以从32位格式中产生好得多的图像质量。这具有节省能量(更适用于功率匮乏的设备)、减少热量、提高性能等潜力。这在许多尺寸和功率受限的设备(诸如视频游戏控制台、移动电话以及可穿戴设备或其他虚拟现实或增强现实设备)上可能尤为重要。

在到ayb空间的3x3矩阵转换中,v的范围从0到0.62,并且u的范围从0到0.59。u通道中的精度可以通过与v分离地减少被编码的范围来增大。下面提供用于生成将普通rgb空间转换为被称为(a,y,b)的中间线性空间所需的矩阵的指令的示例:

在过程700的一些方面中,可以在操作710处(可选的)在像素数据上执行一个或多个混合、滤波、其他操作。在一些情况下,可以例如在操作702之后在rgb值上执行操作710,或者可以在操作704之后在中间颜色空间数据上执行操作710。

图8描绘了用于利用中间颜色空间对像素数据进行解码的示例过程。在一些方面中,过程800可以被实施为对以32位hdr图像格式或数据结构(例如,l14u9v9)的颜色数据进行解码。过程800可以由gpu(诸如gpu108)的一个或多个硬件部件、图形管线200的一个或多个软件部件、在cpu106上执行的软件或其组合来执行。过程800可以被实施为以上描述的过程700的逆。

过程800可以在操作802处开始,其中(例如,以32位hdr格式400的)luv数据可以被解压缩或解包成中间颜色空间数据。为了将luv数据解压缩回线性空间,除法操作需要被反转,其要求另一倒数。操作802可以包括如下地解包中间空间的每个值:

y=解包float14(l)

b=y/解包unorm9(v)

a=解包unorm9(u)*b

在一些方面中,一旦luv数据已经被解压缩为ayb数据,颜色信息就可以再次被线性地混合。注意,仅需要一个倒数,但是推导b要求l和v通道两者,并且推导a需要所有三个通道。在过程800的一些方面中,操作808可以在接下来被执行(可选的),其中诸如滤波、混合以及上缩放的一个或多个操作可以在中间颜色空间数据上执行。以这种方式,在与将颜色信息一直解码到rgb信息(例如,执行操作804或806中的一个或多个)以执行这些操作相比时,可以节省计算资源、存储器资源和/或时间。

在一些情况下,可以在操作808处在中间颜色空间数据(例如,线性颜色数据)上执行的操作可以包括读取、写入、混合(其可以被表征为读取、修改、写入操作)、经滤波的样本操作(例如,收集4个邻近像素,单独地对它们进行解码,并且将它们混合在一起)和/或扫描输出或光栅化到2d阵列。在一些方面中,这些操作中的一个或多个可以以硬件(例如,gpu108)来执行以进一步提高由32位hdr颜色格式提供的效率。

下面提供用于对32位hdr颜色格式进行转换和混合的指令的示例:

接下来,在操作804处,根据如以上所描述的以下关系,中间颜色空间数据可以被变换为rgb颜色数据:

[r,g,b]=矩阵-1*[a,y,b]

然后,rgb颜色信息可以在操作810处被输出,此时,过程800可以结束。

在一些方面中,操作802、804、806和808中的一些或全部可以以硬件(例如通过gpu108)来执行。在其他方面中,操作802、804、806和808中的一个或多个可以以诸如与cpu106相关联的软件来执行。在一些方面中,过程800的操作可以被分配给硬件和/或软件以匹配过程700,或者可以不同。

以上描述的技术可以被实施在如下面更详细地描述的一个或多个计算设备或环境上。图9描绘了另一示例通用计算环境,例如,其包括与视频或图像存储器903通信的gpu929,本文中描述的技术中的一些可以被实现于其中。计算系统环境902是仅是适当的计算环境的一个示例并且不旨在建议对本文公开的主题的使用或功能的范围的任何限制。计算环境902也不应当被理解为具有与在示例操作环境902中图示的任何一个组件或组件的组合的任何依赖性或要求。在一些实施例中,各种所描绘的计算元件可以包括被配置为实例化本公开的具体方面的电路。例如,本公开中使用的术语电路可以包括被配置为执行由固件或开关执行的(多个)功能的专用硬件部件。在其他示例实施例中,术语电路可以包括由实现可用于执行(多个)功能的逻辑的软件指令配置的通用处理单元、存储器等。在电路包括硬件和软件的组合的示例实施例中,实施者可以编写实现逻辑的源代码并且源代码可以被编译成可以由通用处理单元处理的机器可读代码。由于本领域技术人员可以理解现有技术已经演变到在硬件、软件或硬件/软件的组合之间几乎不存在差别的时候,所以对用以实现特定功能的硬件和软件的选择是留给实施者的设计选择。更具体地,本领域技术人员可以理解软件过程可以被变换成等效硬件结构,并且硬件结构本身可以被变换成等效软件过程。因此,对硬件实施方式和软件实施方式的选择是设计选择之一并且被留给实施者。

计算机902通常包括各种计算机可读介质,该计算机902可以包括以下中的任一项:移动设备或智能电话、平板电脑、笔记本电脑、台式计算机、或联网设备的集合、云计算资源等。计算机可读介质可以是可以由计算机902访问的任何可用介质,并且包括易失性介质和非易失性介质、可移动介质和不可移动介质。系统存储器922包括以易失性存储器和/或非易失性存储器的形式的计算机可读存储介质,诸如只读存储器(rom)923和随机访问存储器(ram)960。基本输入/输出系统924(bios)通常被存储在rom923中,系统924包含有助于诸如在启动期间在计算机902内的元件之间传递信息的基本例程。ram960通常包含处理单元959直接可访问的和/或当前由处理单元959操作的数据和/或程序模块。通过示例而非限制的方式,图9图示了操作系统925、应用程序926、包括渲染管线965a的其他程序模块927、以及程序数据928。在一些方面中,如以上所描述的,渲染管线965a可以部分地或完全地在gpu929中被实施为渲染管线956b。

计算机902还可以包括其他可移除/不可移除的、易失性/非易失性的计算机存储介质。仅通过示例的方式,图9图示了从不可移除的非易失性磁性介质读取或写入到该不可移除的非易失性磁性介质的硬盘驱动器938、从可移除的非易失性磁盘954读取或写入到该可移除的非易失性磁盘954的磁盘驱动器939、以及从可移除的非易失性光盘953(诸如cdrom或其他光学介质)读取或写入到该可移除的非易失性光盘953(诸如cdrom或其他光学介质)的光盘驱动器904。能够被用在示例操作环境中的其他可移除/不可移除的、易失性/非易失性的计算机存储介质包括但不限于磁带盒、闪存卡、数字多用盘、数字视频带、固态ram、固态rom等。硬盘驱动器938通常通过诸如接口934的不可移除存储器接口连接到系统总线921,并且磁盘驱动器939和光盘驱动器904通常通过诸如接口935或936的可移除存储器接口连接到系统总线921。

以上所讨论的并在图9中图示的驱动器及其相关联的计算机存储介质提供针对计算机902的计算机可读指令、数据结构、程序模块和其他数据的存储。在图9中,例如,硬盘驱动器938被图示为存储操作系统958、应用程序957、其他程序模块956、以及程序数据955。注意,这些部件可以与操作系统925、应用程序926、其他程序模块927、以及程序数据928相同或者不同。此处,操作系统958、应用程序957、其他程序模块956、以及程序数据955被给予不同的数字以至少说明它们是不同的副本。用户可以通过诸如键盘951和通常被称为鼠标、跟踪球或触摸板的指向设备952的输入设备将命令和信息输入到计算机902中。其他输入设备(未示出)可以包括麦克风、操纵杆、游戏板、卫星盘、扫描器、视网膜扫描器等。这些和其他输入设备通常通过被耦合到系统总线921的用户输入接口936连接到处理单元959,但是可以通过诸如并行端口、游戏端口或通用串行总线(usb)的其他接口和总线结构而连接。监视器942或其他类型的显示设备也经由诸如视频接口932的接口连接到系统总线921。除了监视器之外,计算机还可以包括诸如扬声器944和打印机943的其他外围输出设备,其可以通过输出外围接口933连接。

计算机902可以使用到诸如远程计算机946的一个或多个远程计算机的逻辑连接在网络化环境中操作。远程计算机946可以是个人计算机、服务器、路由器、网络pc、对等设备或其他常见网络节点,并且通常包括以上关于计算机902描述的元件中的许多或全部,但是在图9中仅图示了存储器存储设备947。图9中描绘的逻辑连接包括局域网(lan)945和广域网(wan)949,但是还可以包括其他网络。这样的网络化环境在办公室、企业级计算机网络、内联网、互联网和云计算资源中是常见的。

当被用于lan网络化环境中时,计算机902通过网络接口或适配器937连接到lan945。当被用于wan网络化环境中时,计算机902通常包括用于通过诸如互联网的wan949建立通信的调制解调器905或其他装置。可以是内部的或外部的调制解调器905可以经由用户输入接口936或其他合适的机制连接到系统总线921。在联网环境中,所描绘的与计算机902相关的程序模块或其部分可以被存储在远程存储器存储设备中。通过举例而非限制的方式,图9将远程应用程序948图示为驻存在存储器设备947上。将理解的是,所示的网络连接是示例,并且可以使用在计算机之间建立通信链接的其他方式。

在一些方面中,其他程序927可以包括渲染管线965a,其可以包括如上所述的功能。在一些情况下,渲染管线965b可以代替地被实施在gpu929中。在一些情况下,gpu929还可以包括自定义编码器/解码器980b,其可以经由如以上所描述的过程700和800对诸如数据结构400的32位hdr颜色数据进行编码和解码。在一些方面中,编码器/解码器980a可以部分地或完全地以与其他程序927相关联的软件来实施。

前面部分中描述的过程、方法和算法中的每个可以被实现在由一个或多个计算机或计算机处理器执行的代码模块中并且完全地或部分地由这些代码模块自动化。代码模块可以被存储在任何类型的非瞬态计算机可读介质上或诸如硬盘驱动器、固态存储器、光盘等的计算机存储设备上。过程和算法可以被部分地或完全地实施在专用电路中。所公开的过程和过程步骤的结果可以被永久地或者以其他方式地存储在诸如易失性或非易失性存储装置的任何类型的非瞬态计算存储装置中。以上描述的各种特征和过程可以彼此独立地被使用,或者可以以各种方式来组合。所有可能的组合和子组合旨在落入本公开的范围内。此外,在一些实施方式中,一些方法或过程块可以被省略。本文所描述的方法和过程也不限于任何特定顺序,并且与其相关的块或状态可以以合适的其他顺序来执行。例如,所描述的块或状态可以以除了具体公开的顺序之外的顺序来执行,或者多个块或状态可以被组合在单个块或状态中。示例块或状态可以被顺序地、并行地或以某种其他方式来执行。块或状态可以被添加到所公开的示例实施例或从所公开的示例实施例移除。本文所描述的示例系统和部件可以以与所描述的不同的方式来配置。例如,与所公开的示例实施例相比,元件可以被添加、移除或重新布置。

还将理解的是,各种项被图示为在被使用的同时被存储于存储器中或存储装置上,并且这些项或其部分可以在存储器和其他存储设备之间转移以用于存储器管理和数据完整性的目的。备选地,在其他实施例中,软件模块和/或系统中的一些或全部可以在另一设备上的存储器中执行并且经由计算机间通信与所图示的计算系统通信。此外,在一些实施例中,系统和/或模块中的一些或全部可以以其他方式来实施或提供,诸如至少部分地以固件和/或硬件来实施,包括但不限于一个或多个专用集成电路(asic)、标准集成电路、控制器(例如,通过执行合适的指令,并且包括微控制器和/或嵌入式控制器)、现场可编程门阵列(fpga)、复杂可编程逻辑器件(cpld)等。模块、系统和数据结构中的一些或全部也可以被存储(例如,作为软件指令或结构化数据)在计算机可读介质上,诸如硬盘、存储器、网络或由合适的驱动器或经由合适的连接读取的便携式介质产品。为了本说明书和权利要求书的目的,词语“计算机可读存储介质”及其变型不包括波、信号、和/或其他暂态和/或无形通信介质。系统、模块和数据结构也可以作为在包括基于无线的和基于有线/线缆的介质的各种计算机可读传输介质上生成的数据信号(例如,作为载波或其他模拟或数字传播信号的一部分)而被传输,并且可以采取各种形式(例如,作为单路或多路模拟信号的一部分,或者作为多个离散数字分组或帧)。在其他实施例中,这样的计算机程序产品也可以采取其他形式。因此,本公开可以利用其他计算机系统配置来实践。

本文中使用的诸如“能够”、“有可能”、“可以”、“可行”、“例如”等以及其他的条件性语言一般旨在传达某些实施例包括而其他实施例不包括特定特征、元件和/或步骤,除非另行明确陈述或在所使用的上下文内另外理解。因此,这样的条件性语言总体上不旨在暗示一个或多个实施例以任何方式需要特征、元件和/或步骤,或者一个或多个实施例必须包括用于在具有或没有作者输入或提示的情况下决策的逻辑,无论这些特征、元件和/或步骤是否被包含在任何特定实施例中或者要在任何特定实施例中被执行。术语“包括”、“包含”、“具有”等是同义词并且以开放式被包含性地使用,并且不排除附加的元件、特征、动作、操作等等。此外,术语“或者”以其包含性意义(而不是以其排他性意义)被使用,使得例如在被用来连接一列元件时,术语“或者”意指列表中的元件中的一个、一些或全部。

尽管已经描述了某些示例实施例,但是这些实施例仅通过示例的方式来呈现并且不旨在限制本公开内容的范围。因此,前述描述中的任何内容都不旨在暗示任何特定特征、特性、步骤、模块或块是必要的或必不可少的。实际上,本文所描述的新颖的方法和系统可以以各种其他形式来实现;此外,可以在不脱离本公开的精神的情况下进行对本文中所描述的方法和系统的形式的各种删减、替代和改变。所附权利要求和其等效方案旨在涵盖这样的形式或修改,只要其将落入本公开中的某些的范围和精神内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1