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

时间:2013-05-03 10:46:45

标签: opengl sdl srgb

SDL的文档似乎没有提及很多关于色彩空间的内容。我没有看到SDL_SetVideoModeSDL_GL_SetAttribute的任何SRGB标志/参数。在FrameBuffer 0上写入时,SDL是否可以要求OpenGL执行色彩校正? GLUT seems to be able to provide that functionality

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

3 个答案:

答案 0 :(得分:7)

很抱歉在这里重新提出一个旧问题,但我想要注意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功能。但是你去了。

答案 1 :(得分:4)

稍微更准确一点: 您只需要调用glEnable(GL_FRAMEBUFFER_SRGB)将Framebuffer 0设置为SRGB帧缓冲区。

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

答案 2 :(得分:3)

“通常的解决方法”是“不要使用SDL”。如果您的工具不支持它,那么您的工具不支持它,就是这样。

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

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

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

您是否可以忍受这些文物取决于您自己。我会尽快避免使用SDL,或者黑客攻击SDL让你做你需要的事情。