PDA

View Full Version : Check color encoding in the default framebuffer draw buffer for SRGB



elect
12-18-2014, 11:10 PM
I am in the process of implementing sRGB space in my application.

From what I read here (http://stackoverflow.com/questions/6397817/color-spaces-gamma-and-image-enhancement), here (http://stackoverflow.com/questions/11386199/when-to-call-glenablegl-framebuffer-srgb), here (https://www.opengl.org/wiki/Image_Format#sRGB_colorspace) and here (https://www.opengl.org/wiki/Framebuffer#Colorspace) I should operate in linear RGB (LRGB) space for the whole pipeline and I dont have to care about any gamma correction since OpenGL will take care about it for me given I enable GL_FRAMEBUFFER_SRGB​ and the image is either GL_SRGB8 or GL_SRGB8_ALPHA8.

So my idea is to be sure I submit inputs in LRGB space and then I render my final texture (doing depth peeling) on the default framebuffer that will take care of porting my colors to the SRGB space so that I will see them on LRGB on my monitor.

Ok, now I want to check the default draw buffer of the default framebuffer.


int[] drawBuffer = new int[1];

gl3.glGetIntegerv(GL3.GL_DRAW_BUFFER, drawBuffer, 0);

System.out.println("draw buffer " + (drawBuffer[0] == GL3.GL_BACK ? "BACK " : drawBuffer[0]));

this confirms my draw buffer is GL_BACK, now I want to check the color encoding


int[] framebufferAttachmentParameter = new int[1];

gl3.glGetFramebufferAttachmentParameteriv(GL3.GL_D RAW_FRAMEBUFFER, GL3.GL_BACK,
GL3.GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, framebufferAttachmentParameter, 0);

but glGetFramebufferAttachmentParameteriv fails:


> glGetError() returned the following error codes after a call to glGetFramebufferAttachmentParameteriv(<int> 0x8CA9, <int> 0x405, <int> 0x8210, <[I>, <int> 0x0): GL_INVALID_ENUM ( 1280 0x500)

Reading here (https://www.opengl.org/sdk/docs/man3/xhtml/glGetFramebufferAttachmentParameter.xml) they say


If the default framebuffer is bound to target then attachment must be one of GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, or GL_BACK_RIGHT

But my code say my draw buffer is GL_BACK. Reading here (https://www.opengl.org/wiki/Default_Framebuffer) they say the GL_BACK is just an alias that indicates both GL_BACK_LEFT and GL_BACK_RIGHT if I do stereotic rendering.

So my questions are:

- am I right assuming that I am writing to GL_BACK_LEFT given my draw buffer returns GL_BACK

- how can I check if stereotic rendering is on/off? Of course since I dont know even how to turn it on, I assume it is off. But is something I do by just enabling both GL_BACK/FRONT_LEFT/RIGHT buffers or something else?

- can I turn on SRGB space on the default draw buffer of the default framebuffer?

Alfonse Reinheart
12-19-2014, 05:57 AM
am I right assuming that I am writing to GL_BACK_LEFT given my draw buffer returns GL_BACK

Yes, but:


Reading here they say the GL_BACK is just an alias that indicates both GL_BACK_LEFT and GL_BACK_RIGHT if I do stereotic rendering.

Yes, it is an alias. However, as the page you linked to indicated, "These are only allowed in glDrawBuffer​ (not glDrawBuffers​; note the "s") and glReadBuffer​." Since glGetFramebufferAttachmentParameteriv is not one of those functions, it is not allowed there. You must instead use a specific buffer name (GL_BACK_LEFT or GL_BACK_RIGHT)


how can I check if stereotic rendering is on/off?

That's not really something you should have to check. If you don't ask for it at context creation time, then it's not on.


can I turn on SRGB space on the default draw buffer of the default framebuffer?

Only by creating a rendering context who's images use the sRGB colorspace (https://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt).