Name EXT_colorspace Name Strings WGL_EXT_colorspace Contact Christophe Riccio (christophe 'dot' riccio 'at' unity3d 'dot' com) Contributors Piers Daniell, NVIDIA Corporation Slawomir Grajewski, Intel IP Status No known IP claims. Status Shipping Version 2016-11-30 Number OpenGL Extension #498 Dependencies WGL_ARB_pixel_format is required. This extension is written against WGL_ARB_pixel_format extension. OpenGL dependencies: OpenGL 3.0 is required OpenGL ES dependencies: OpenGL ES 3.0 or GL_EXT_sRGB is required. Overview Applications may wish to use sRGB format default framebuffers to more easily achieve sRGB rendering to display devices. This extension allows creating pixel formats which will be rendered to in sRGB by OpenGL/ES contexts supporting that capability. New Procedures and Functions None. New Tokens Accepted as an attribute name by wglGetPixelFormatAttribivARB, wglGetPixelFormatAttribivARB and wglChoosePixelFormatARB WGL_COLORSPACE_EXT 0x309D Accepted as attribute values for WGL_COLORSPACE_ARB by wglGetPixelFormatAttribivARB, wglGetPixelFormatAttribivARB and wglChoosePixelFormatARB WGL_COLORSPACE_SRGB_EXT 0x3089 WGL_COLORSPACE_LINEAR_EXT 0x308A (these enums are aliases of the corresponding VG colorspace attribute values from EGL 1.3 and OpenGL/ES colorspace attribute values from EGL_KHR_gl_colorspace) Additions to the WGL Specification Following: WGL_AUX_BUFFERS_ARB The number of auxiliary buffers. Add a new attribute: WGL_COLORSPACE_EXT Buffers color space. This can be set to WGL_COLORSPACE_SRGB_EXT or WGL_COLORSPACE_LINEAR_EXT. Following: WGL_AUX_BUFFERS_EXT integer minimum Add: WGL_COLORSPACE_EXT enum exact Before paragraph: Attributes that are specified in neither ... Add paragraph: WGL_COLORSPACE_EXT specifies the color space used by OpenGL and OpenGL ES when rendering to the surface. If its value is WGL_COLORSPACE_SRGB_EXT, then a non-linear, perceptually uniform color space is assumed, with a corresponding GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING value of GL_SRGB. If its value is WGL_COLORSPACE_LINEAR_EXT, then a linear color space is assumed, with a corresponding GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING value of GL_LINEAR. The default value of WGL_COLORSPACE_EXT is WGL_COLORSPACE_LINEAR_EXT for OpenGL ES and OpenGL. With OpenGL pixel formats with WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT set are capable of supporting sRGB encoding when GL_FRAMEBUFFER_SRGB is enabled. Only OpenGL and OpenGL ES contexts which support sRGB rendering must respect requests for WGL_COLORSPACE_SRGB_EXT, and only to sRGB formats supported by the context (normally just SRGB8) Older versions not supporting sRGB rendering will ignore this surface attribute. Applications using OpenGL must additionally enable GL_FRAMEBUFFER_SRGB to perform sRGB rendering, even when an sRGB surface is bound; this enable is not required (or supported) for OpenGL ES. WGL itself does not distinguish multiple colorspace models. Refer to the 'sRGB Conversion' sections of the OpenGL 4.3 and OpenGL ES 3.0 specifications for more information. Sample Code bool SetupPixelFormat(HDC DC, bool Linear) { int const Attrib[] = {WGL_NUMBER_PIXEL_FORMATS_ARB}; int FormatCount = 0; BOOL Result = wglGetPixelFormatAttribivARB(DC, NULL, NULL, 1, Attrib, &FormatCount); if(Result != GL_TRUE) return false; std::vector PixelFormats(static_cast(FormatCount)); int Attributes[] = { WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, WGL_DOUBLE_BUFFER_ARB, GL_TRUE, WGL_RED_BITS_ARB, 8, WGL_GREEN_BITS_ARB, 8, WGL_BLUE_BITS_ARB, 8, WGL_ALPHA_BITS_ARB, 8, WGL_DEPTH_BITS_ARB, 24, WGL_STENCIL_BITS_ARB, 8, WGL_SAMPLES_ARB, 1, WGL_STEREO_ARB, GL_FALSE, WGL_COLORSPACE_EXT, Linear ? WGL_COLORSPACE_LINEAR_EXT : WGL_COLORSPACE_SRGB_EXT 0, 0 }; UINT ActualFormatCount = 0; Result = wglChoosePixelFormatARB(DC, Attributes, NULL, FormatCount, &PixelFormats[0], &ActualFormatCount); if(Result != GL_TRUE || ActualFormatCount <= 0) return false; PIXELFORMATDESCRIPTOR PixelFormatDesc = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, kDepthBits, kStencilBits, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; // Select the first PixelFormat return SetPixelFormat(DC, 0, &PixelFormatDesc) == GL_TRUE; } bool IsDefaultFramebufferLinear() { glBindFramebuffer(GL_FRAMEBUFFER, 0); GLint Encoding = 0; // Just like for framebuffer object, return GL_SRGB is the framebuffer support sRGB update and blending and GL_LINEAR is no sRGB conversion can be performed glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER, GL_BACK_LEFT, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, &Encoding); return Encoding == GL_LINEAR; } Issues 1) Why do we need this extension? On Windows, OpenGL ES implementation can not perform linear to sRGB conversion on the default framebuffer (eg: back bufffer) due to the lack of glEnable(GL_FRAMEBUFFER_SRGB) toogle. As a result, an application needs to render into a sRGB framebuffer object that support sRGB update and blending and then execute a shader simply to copy the sRGB frmaebuffer object to the default framebuffer. This extension allows to explicitly set the default framebuffer colorspace to automatically performa the sRGB conversion without an intermediate framebufer object. 2) What's the default colorspace of the default framebuffer with OpenGL and OpenGL ES? With OpenGL ES (WGL_CONTEXT_ES_PROFILE_BIT_EXT) the default colorspace is WGL_COLORSPACE_LINEAR_EXT With OpenGL (WGL_CONTEXT_CORE_PROFILE_BIT_ARB or WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB), the default colorspace is WGL_COLORSPACE_SRGB_EXT for WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT pixel formats and WGL_COLORSPACE_LINEAR_EXT otherwise. RESOLVED 3) Does all the context support sRGB? This extension requires OpenGL 3.0, OpenGL ES 3.0 or GL_EXT_sRGB. RESOLVED: Yes. 4) Does we want to support more colorspace than sRGB? The field of color spaces is very vivid these days for good reasons but new color space in OpenGL is not the purpose of this extension. https://developer.nvidia.com/sites/default/files/akamai/gameworks/hdr/UHDColorForGames.pdf RESOLVED: Not in this extension, deferred. 5) What's the interaction with glEnable(GL_FRAMEBUFFER_SRGB) defined in GL_ARB_framebuffer_sRGB and GL_EXT_sRGB_write_control? RESOLVED: - According the the specifications "If the value of FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING is not SRGB, or FRAMEBUFFER_SRGB is disabled, no linearization is performed." - Accoding to WGL_EXT_framebuffer_sRGB "if FRAMEBUFFER_SRGB_EXT is enabled and the boolean FRAMEBUFFER_SRGB_CAPABLE_EXT state for the drawable is true, the R, G, and B destination color values (after conversion from fixed-point to floating-point) are considered to be encoded for the sRGB color space" 6) What's the default colorspace in the pixel formats list? Default values in the pixel formats list are expressed by listing first a pixel format realying on this value. The default value is WGL_COLORSPACE_LINEAR_EXT. 7) How this extension is externally visible? The following speudo code express how this extension interacts with others features: if Default Framebuffer { if OpenGL IF EnableSRGB && (sRGBCapable || sRGBColorspace) THEN perform framebuffer sRGB conversions. else if OpenGL ES IF sRGBColorspace THEN perform framebuffer sRGB conversions. } else { if OpenGL IF EnableSRGB && FormatSRGB THEN perform framebuffer sRGB conversions. else if OpenGL ES IF FormatSRGB THEN perform framebuffer sRGB conversions. } Additionnally, this extension add a number of new pixel formats for WGL_COLORSPACE_LINEAR_EXT and WGL_COLORSPACE_SRGB_EXT which pixel formats variation relying WGL_COLORSPACE_LINEAR_EXT are listed first. Revision History 2016-11-30 - criccio + Clarify default pixel formats + Add issue 6 and 7 + Clarify issue 5 2016-08-30 - criccio + Add issue 5 2016-07-14 - criccio + Initial draft based on EGL_KHR_gl_colorspace