gpt4 book ai didi

opengl - 我需要在片段着色器中进行输出 Gamma 校正吗?

转载 作者:行者123 更新时间:2023-12-04 13:19:02 25 4
gpt4 key购买 nike

当我通过 fragColor 输出颜色时在 main()片段着色器的功能,颜色分量强度是否被解释为线性 RGB 或 sRGB?或者换句话说,我是否必须在我的着色器中执行 Gamma 校正,或者这是否已经得到处理?

如果没有通用答案但取决于某些 OpenGL 属性:如何设置此属性?

为避免误解:相应的颜色已完全以编程方式生成,没有纹理等(可能需要输入 Gamma 校正)。

最佳答案

每个片段着色器输出都路由到帧缓冲区中的特定图像 ( based on glDrawBuffers state )。该图像具有格式。该格式定义了相应输出的默认色彩空间解释。

因此,如果您以线性 RGB 格式将值写入图像,则系统会将该值解释为线性 RGB 值。如果您正在为 an sRGB format 中的图像写入值,然后系统会将该值解释为已经在 sRGB 色彩空间中。所以不会执行任何转换;它将按原样写入纹理。如果混合处于事件状态,您写入的 sRGB 值将在 sRGB 色彩空间中与图像中的 sRGB 值混合。

现在,在写入 sRGB 色彩空间图像时,您通常不希望出现这种行为。如果您有一个线性 RGB 值,您希望系统将该值转换为 sRGB 色彩空间(而不是假装它已经是)。同样重要的是,当混合处于事件状态时,您希望将 sRGB 图像中的值转换为线性 RGB,然后与片段着色器写入的线性值混合,最后转换回 sRGB。否则,混合会产生令人怀疑的准确性的结果。

为了实现这一切,您 must glEnable(GL_FRAMEBUFFER_SRGB) .启用此功能后,会为写入任何颜色空间为 sRGB 的任何图像的任何片段着色器输出进行颜色空间转换。

默认情况下禁用此值。

因此,如果您想写入线性 RGB 值并将它们转换为 sRGB 以进行显示,那么您必须:

  • 确保您正在写入的帧缓冲区图像使用 sRGB 色彩空间。对于 FBO 来说,这是微不足道的。但是,如果您正在写入默认的帧缓冲区,那么您必须使用 OpenGL 初始化代码来解决这个问题。
  • 启用 GL_FRAMEBUFFER_SRGB当您希望使用色彩空间转换时。
  • 关于opengl - 我需要在片段着色器中进行输出 Gamma 校正吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56204242/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com