SDL可以创建sRGB OpenGL上下文吗?

Nir*_*iel 3 opengl sdl srgb

SDL的文档似乎没有提到很多关于颜色空间的内容.我没有看到任何SRGB标志/参数SDL_SetVideoModeSDL_GL_SetAttribute.在FrameBuffer 0上写入时,SDL是否可以要求OpenGL执行色彩校正? GLUT似乎能够提供该功能.

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

小智 9

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

SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1);
// etc.
SDL_Window *win = SDL_CreateWindow(...);
SDL_GL_CreateContext(win);
Run Code Online (Sandbox Code Playgroud)

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


小智 5

稍微精确一点:您只需要调用glEnable(GL_FRAMEBUFFER_SRGB)即可将Framebuffer 0变成SRGB framebuffer。

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


Nic*_*las 4

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

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

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

能够直接呈现 sRGB 图像的目的是避免这种转换以及由此导致的颜色清晰度损失。

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