4

SDL 的文档似乎没有过多地提及色彩空间。我没有看到SDL_SetVideoModeor的任何 SRGB 标志/参数SDL_GL_SetAttribute。在 FrameBuffer 0 上写入时,SDL 是否有可能要求 OpenGL 执行颜色校正? GLUT 似乎能够提供该功能

如果 SDL 无法做到这一点,通常的解决方法是什么?我正在考虑在GL_FRAMEBUFFER_SRGB启用的情况下渲染到 sRGB 纹理,然后在FRAMEBUFFER_SRGB禁用的情况下将其渲染到 FrameBuffer 0 中。有更好的主意吗?

4

3 回答 3

11

很抱歉在这里提出一个老问题,但我想指出 SDL 2.0.1 将明确允许您请求 sRGB 上下文:

SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1);
// etc.
SDL_Window *win = SDL_CreateWindow(...);
SDL_GL_CreateContext(win);

这适用于 Windows 和 X11(Mac OS X 等,目前不提供此功能)。值得注意的是,在 SDL 2.0.1 提供此功能之前,现代硬件上的大多数 GL 上下文已经默认支持 sRGB。但是你去。

于 2013-11-07T16:56:44.443 回答
5

更准确地说:您只需调用glEnable(GL_FRAMEBUFFER_SRGB)将 Framebuffer 0 设置为 SRGB 帧缓冲区。

如果您使用的是 SDL2,则应该通过SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1)在 init 期间调用来请求该功能,但如果您使用的是早期版本的 SDL,那么现在图形驱动程序似乎并不关心您是否事先请求它。

于 2013-12-01T01:52:31.083 回答
4

“通常的解决方法”是“不要使用 SDL”。如果您的工具不支持它,那么您的工具不支持它,仅此而已。

您建议的渲染到内部 sRGB 图像的解决方法是......不像您想象的那么有用。

它会起作用吗?是的,从某种意义上说,您将获得颜色正确伽马正确的图像(尽管不是因为启用或禁用GL_FRAMEBUFFER_SRGB)。但是,图像质量会有所下降,因为非线性 24 位 sRGB 颜色空间不能很好地转换为线性 24 位 linearRGB 颜色空间。你会失去一些颜色定义。

能够直接呈现 sRGB 图像的目的是避免这种转换和由此导致的颜色定义损失。

您是否可以忍受这些文物取决于您。我会尽快避免使用 SDL,或破解 SDL 让您做您需要做的事情。

于 2013-05-03T11:05:22.760 回答