首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8位sRGB和OpenGL混淆

8位sRGB和OpenGL混淆
EN

Stack Overflow用户
提问于 2017-11-03 08:33:16
回答 2查看 1.2K关注 0票数 2

我想要求澄清sRGB颜色空间及其在OpenGL中的每通道8位表示。在深入研究这个主题之后,我发现在sRGB中存储图像仅仅是为了补偿监视器所做的相反的伽马操作--因为兼容性的原因,监视器“模仿”了旧的CTR所做的事情。事实上,人眼有相似的非线性响应只是一个巧合,与伽马校正无关(正如许多令人困惑的文章所宣称的那样),因为输出将是反正又是线性的

假设这种理解是正确的,在OpenGL中,我们有纹理的GL_SRGB8_ALPHA8格式,它每个通道有8位。但是,由于0~255的范围与线性RGB纹理相同,这是否意味着要将每个通道的线性8位纹理转换为sRGB,颜色值保持不变,一个简单的“标志”告诉OpenGL:看这个0~255范围不是线性的,所以将它们解释为一条曲线?那么,sRGB每频道图像16位(例如。16位PNG)?

EN

回答 2

Stack Overflow用户

发布于 2017-11-03 14:48:38

范围是一样的。不是

存储前的线性值是浮点。因此,他们有更高的精度比8位每通道格式。

如果将它们存储在linearRGB图像中,则将输入范围为0、1,并将它们均匀映射到0,255。

但是如果你做了sRGB转换,那么你就得到了0,1的范围,并通过大约2.2的非线性伽玛映射将它们映射到0,255。虽然这种非线性映射不会神奇地创造更多的值,但它所做的实际上是在范围的较高部分比较低部分提供了更高的精度。

在sRGB转换中,输入范围0.5、1中的值映射到56,255。这超过了50%的输入范围所涵盖的输出范围的75%。这可以更好地表示输入中较大的值。

线性映射平均损失精度。sRGB映射在较暗的区域比较轻的区域失去更高的精度。换句话说,它比线性映射在较轻的区域保持了更高的精度。

对于内存和视觉质量的权衡,sRGB的整体表现要好于linearRGB 8位/通道。

但是,由于0~255的范围与线性RGB纹理相同,这是否意味着要将每个通道的线性8位纹理转换为sRGB,颜色值保持不变,一个简单的“标志”告诉OpenGL:看这个0~255范围不是线性的,所以将它们解释为一条曲线?

这取决于你说的是什么手术。

sRGB纹理是将其RGB信息存储在sRGB颜色空间中的纹理。但是,假定着色器操作需要linearRGB颜色空间中的数据,而不是sRGB。所以从sRGB读取到linearRGB的像素

使用sRGB格式从片段着色器写入附于FBO的图像可以执行转换,也可以不执行转换。在这里,必须使用GL_FRAMEBUFFER_SRGB显式启用转换。其想法是某些操作将在sRGB颜色空间中生成值(例如,GUI)。大多数图像是在sRGB颜色空间中创建的,而其他图像将在linearRGB (正常呈现)中生成值。因此,您可以选择打开或关闭转换。

转换还允许混合到读取sRGB目标像素,将它们转换为线性,与传入的linearRGB值混合,然后将它们转换回sRGB进行写入。

上传和从sRGB图像下载将直接写入和读取sRGB颜色空间中的像素值。

那么,sRGB每频道图像16位(例如。16位PNG)?

他们怎么了?OpenGL没有每通道16位的sRGB格式.

sRGB转换通常通过256个条目表查找来完成.对于每一个sRGB值,都有一个预先计算的线性值.

因此,就像图像格式提供一些OpenGL不匹配的东西的其他情况一样,您必须手动转换它们。

票数 4
EN

Stack Overflow用户

发布于 2019-06-21 09:53:02

γ是好的

我发现,在sRGB中存储图像只是为了补偿monitor...the所做的相反的伽马运算,即人眼有相似的非线性响应,这只是巧合,与伽马校正无关.假设这一理解是正确的__,

这种理解是不正确的。由于感知上的原因,用伽马曲线存储图像对于增加黑暗区域的数据密度是必要的。没有伽马,你将需要12位线性的图像保真度与8位和一条伽马曲线相同。

老式电视本来可以设计成使用线性化信号,但事实上,当时的设计技术将伽马从理论上的1.5增加到了通常使用的2.4。作为系统设计的一项功能,伽玛的使用降低了广播信号中对噪声的感知。

伽马型传输曲线通过加权每个人的非线性视觉感知的可用带宽来最大限度地利用有限的带宽。

OPENGL

至于您的问题,如果内部格式参数是GL_SRGB、GL_SRGB8、GL_SRGB_ALPHA或GL_SRGB8_ALPHA8,则纹理将被视为红色、绿色或蓝色组件在sRGB颜色空间中编码。。

这意味着图像中的值被假定为伽马编码值,而不是假定为线性的GL_RGB8值。

但是,由于0~255的范围与线性RGB纹理相同,这是否意味着要将每个通道的线性8位纹理转换为sRGB,颜色值保持不变,一个简单的“标志”告诉OpenGL:看这个0~255范围不是线性的,所以将它们解释为一条曲线?那么,sRGB每频道图像16位(例如。16位PNG)?

距离或钻头深度与伽马曲线的使用与否毫无关系。

由于知觉的原因,图像需要伽马射线。线性纹理映射或凹凸映射没有。如果您在线性凸点映射上使用GL_SRGB8标记,那么GL将对那些您不想做的线性数据使用sRGB伽马-也就是说,它将应用一条约为2.2到线性1.0值的幂曲线,这是您不想要的,除非您的凸点映射是一幅具有伽马曲线的图像。

sRGB标签就在那里,所以当你有一个sRGB图像,它的颜色值编码为~1/2.2曲线时,这些值就线性化了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47091421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档