glGetTexImage/glGetCompressedTexImage 和 sRGB 色彩空间

glGetTexImage/glGetCompressedTexImage and sRGB colorspace

当我使用 sRGB 内部格式时,例如 GL_SRGB8_EXTGL_COMPRESSED_SRGB_S3TC_DXT1_EXT 作为 glTexImage2D 参数,我在着色器中读取纹理时得到一个自动 sRGB 到 lRGB 的转换。 glGetTexImage/glGetCompressedTexImage 是否也执行此类转换?

否,glGetTexImage/glGetCompressedTexImage不执行 sRGB 转换。 glTexImage2D 也没有。如果您使用 glTexImage2D 设置纹理图像并稍后使用 glGetTexImage 检索它(使用相同的格式和类型),您将读回在开始时传递给 glTexImage2D 的相同数据.纹理的内部格式是 GL_SRGB8 还是 GL_RGB8.

并不重要

sRGB ↔ 线性转换是 server-side 操作,即由 GPU 上的操作执行。 sRGB 到线性的转换仅在 GPU 从纹理(从着色器、glBlitFramebuffer 等)读取时发生。线性到 sRGB 的转换仅在 GPU 写入纹理时发生(通过 imageStore、FBO、glBlitFramebuffer 等)。因此,如果将线性数据渲染为 sRGB 纹理,则 then glGetTexImage 将 return sRGB 数据。但是,转换是在渲染到纹理时完成的,而不是在 glGetTexImage 调用中完成的。