2013-05-03 37 views
2

SDL的文檔似乎沒有提及色彩空間。我沒有看到SDL_SetVideoModeSDL_GL_SetAttribute的任何SRGB標記/參數。在FrameBuffer 0上寫入時,SDL是否有可能要求OpenGL執行顏色校正? GLUT seems to be able to provide that functionalitySDL是否可以創建sRGB OpenGL上下文?

如果SDL無法做到這一點,通常的解決方法是什麼?我正在考慮渲染到啓用GL_FRAMEBUFFER_SRGB的sRGB紋理,然後將其渲染到禁用FRAMEBUFFER_SRGB的FrameBuffer 0中。有什麼更好的想法

回答

3

「通常的解決方法」是「不要使用SDL」。如果你的工具不支持它,你的工具不支持它,那就是。

您建議的渲染到內部sRGB映像的解決方法是......沒有您想象的那麼有用。

它會工作嗎?是的,從某種意義上說,您將獲得圖像的顏色正確無誤(但不是因爲啓用或禁用GL_FRAMEBUFFER_SRGB)。但是,由於非線性24位sRGB色彩空間不能很好地轉換爲線性24位linearRGB色彩空間,因此會導致圖像質量下降。你會失去一些顏色定義。

能夠直接呈現sRGB圖像的目的是爲了避免該轉換和由此造成的顏色清晰度損失。

無論你能忍受那些神器都取決於你。我儘可能避免使用SDL,或者通過黑客入侵SDL來讓你做你想做的事情。

+0

在最終寫入之前禁用GL_FRAMEBUFFER_SRGB的目標是防止最終的「不正確」。這不行嗎? – Niriel 2013-05-03 12:19:54

+0

該死的,不,不會,該國旗對閱讀沒有任何影響。所以你是對的,這個解決方法是行不通的。我想我必須自己修改着色器。 – Niriel 2013-05-03 12:32:17

+0

@尼爾:看我的編輯。 – 2013-05-03 12:35:25

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功能。但是你去了。

+0

不錯!看看我的軟件包,它是安裝在我的系統上的SDL 1.2.14。我不知道默認情況下可用的sRGB,我想我不得不請求它。我現在正在使用glfw 3,到目前爲止我對它很滿意,但很高興知道SDL仍然是一種選擇。 – Niriel 2013-11-08 09:24:10

+0

您可能還需要設置alpha位大小,否則很可能在Intel驅動程序中無法獲得sRGB幀緩衝區(請參閱https://stackoverflow.com/q/44697485/676939) – Alexandros 2017-06-24 10:10:27

4

稍微更精確一點: 您只需調用glEnable(GL_FRAMEBUFFER_SRGB)即可將Framebuffer 0設置爲SRGB幀緩衝區。

如果您使用的是SDL2,則應該在初始化期間通過調用SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1)來請求該功能,但如果您使用的是早期版本的SDL,則現在似乎圖形驅動程序並不在意您是否事先請求了它。

相關問題