在OpenGL中将SRGB纹理转换为线性

问题描述 投票:0回答:1

我目前正在尝试在渲染器中正确实现伽玛校正。我已将帧缓冲区设置为glEnable(GL_FRAMEBUFFER_SRGB)为SRGB,现在可以正确导入SRGB纹理了。我知道三种方法可以做到这一点:

  1. 在着色器中转换值:vec3 realColor = pow(sampledColor, 2.2)
  2. 让OpenGL为我做:glTexImage2D(..., ..., [GL_SRGB , ..., ..., ..., GL_RGB, ..., ...);

  3. 直接转换值:

    for (GLubyte* pixel = image; pixel < image + size; ++pixel) 
        *pixel = GLubyte(pow(*pixel, 2.2f) + 0.5f);
    

现在,我正在尝试使用第三种方法,但是它不起作用。

  1. 它超级慢(我知道它必须遍历所有像素,但仍然是)。
  2. 它使所有内容看起来都完全错误(请参见下图)。

这里有一些图像。

  1. 没有伽玛校正:enter image description here
  2. 方法2(在片段着色器中采样时的更正)enter image description here
  3. 尝试方法3时有些奇怪enter image description here

所以现在我的问题是方法3出了什么问题,因为它看起来与正确的结果完全不同(假设方法2是正确的,如果我认为是正确的,那么这是正确的。)>]

我目前正在尝试在渲染器中正确实现伽玛校正。我已经使用glEnable(GL_FRAMEBUFFER_SRGB)将帧缓冲区设置为SRGB,现在剩下的就是导入SRGB纹理了...

c++ opengl graphics colors 3d
1个回答
1
投票

我使用glEnable(GL_FRAMEBUFFER_SRGB)将帧缓冲区设置为SRGB;

© www.soinside.com 2019 - 2024. All rights reserved.