glGetTexImage/glGetCompressedTexImage 和 sRGB 色彩空间
glGetTexImage/glGetCompressedTexImage and sRGB colorspace
当我使用 sRGB 内部格式时,例如 GL_SRGB8_EXT
或 GL_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
调用中完成的。
当我使用 sRGB 内部格式时,例如 GL_SRGB8_EXT
或 GL_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
调用中完成的。