| Name |
| |
| EXT_sRGB |
| |
| Name Strings |
| |
| GL_EXT_sRGB |
| |
| Contributors |
| |
| Maurice Ribble |
| Tero Aurto |
| Jon Leech |
| Mark Callow |
| Daniel Koch |
| |
| Parts of this extension are copied from ARB_framebuffer_sRGB. |
| Parts of this extension are copied from EXT_texture_sRGB. |
| |
| Contact |
| |
| Maurice Ribble, Qualcomm (mribble 'at' qualcomm.com) |
| |
| Status |
| |
| Not complete. |
| |
| Version |
| |
| Date: Sept 14, 2011 |
| |
| Number |
| |
| OpenGL ES Extension #105 |
| |
| Dependencies |
| |
| This requires OpenGL ES 1.0 or greater. This extension is written based on |
| the wording of the OpenGL ES 2.0 specification. |
| |
| This extension requires support for OES_rgb8_rgba8 or equivalent |
| functionality. |
| |
| If OES_texture_3D is not supported then the parts of this extension for 3d |
| textures should be ignored. |
| |
| If this is being used with ES 1.x then you need to support |
| OES_framebuffer_object for the framebuffer object related features in this |
| extension. |
| |
| Overview |
| |
| The sRGB color space is based on typical (non-linear) response of the human |
| eye. It has been standardized by the International Electrotechnical |
| Commission (IEC) as IEC 61966-2-1. The transfer function of sRGB roughly |
| corresponds to a power function with a gamma of 2.2. |
| |
| FRAMEBUFFERS |
| |
| OpenGL assumes framebuffer color components are stored in a linear color |
| space. In particular, framebuffer blending is a linear operation. |
| |
| This extension adds a framebuffer capability for sRGB framebuffer update |
| and blending. When blending is disabled but the new sRGB updated mode is |
| enabled (assume the framebuffer supports the capability), high-precision |
| linear color component values for red, green, and blue generated by |
| fragment coloring are encoded for sRGB prior to being written into the |
| framebuffer. When blending is enabled along with the new sRGB update mode, |
| red, green, and blue framebuffer color components are treated as sRGB |
| values that are converted to linear color values, blended with the high- |
| precision color values generated by fragment coloring, and then the blend |
| result is encoded for sRGB just prior to being written into the |
| framebuffer. |
| |
| TEXTURES |
| |
| Conventional texture formats assume a linear color space. So for a |
| conventional internal texture format such as GL_RGB8, the 256 discrete |
| values for each 8-bit color component map linearly and uniformly to the |
| [0,1] range. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| Accepted by the <format> and <internalformat> parameter of TexImage2D, and |
| TexImage3DOES. These are also accepted by <format> parameter of |
| TexSubImage2D and TexSubImage3DOES: |
| |
| SRGB_EXT 0x8C40 |
| SRGB_ALPHA_EXT 0x8C42 |
| |
| Accepted by the <internalformat> parameter of RenderbufferStorage: |
| SRGB8_ALPHA8_EXT 0x8C43 |
| |
| Accepted by the <pname> parameter of GetFramebufferAttachmentParameteriv: |
| FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 |
| |
| Additions to Chapter 3 of the 2.0 Specification (Rasterization) |
| |
| Modify Section 3.7.1, Texture Image Specification: |
| |
| Add 2 new rows to Table 3.3 |
| |
| SRGB_EXT R, G, B Color |
| SRGB_ALPHA_EXT R, G, B, A Color |
| |
| Add 2 new rows to Table 3.4 |
| |
| SRGB_EXT UNSIGNED_BYTE 3 |
| SRGB_ALPHA_EXT UNSIGNED_BYTE 4 |
| |
| Modify Section 3.7.11: Mipmap Generation |
| |
| Add the following sentence to the end of this section: |
| |
| If the format of a texture is sRGB, he error INVALID_OPERATION is |
| generated. |
| |
| Add Section 3.7.14, sRGB Texture Color Conversion |
| |
| If the currently bound texture's internal format is one of SRGB_EXT or |
| SRGB_ALPHA_EXT the red, green, and blue components are converted from an |
| sRGB color space to a linear color space as part of filtering described in |
| sections 3.7.7 and 3.7.8. Any alpha component is left unchanged. Ideally, |
| implementations should perform this color conversion on each sample prior |
| to filtering but implementations are allowed to perform this conversion |
| after filtering (though this post-filtering approach is inferior to |
| converting from sRGB prior to filtering). |
| |
| The conversion from an sRGB encoded component, cs, to a linear component, |
| cl, is as follows. |
| |
| { cs / 12.92, cs <= 0.04045 |
| cl = { |
| { ((cs + 0.055)/1.055)^2.4, cs > 0.04045 |
| |
| Assume cs is the sRGB component in the range [0,1]." |
| |
| Additions to Chapter 4 of the Specification |
| |
| DELETE the following sentence from section 4.1.6 (Blending) because it is |
| moved to the new "sRGB Conversion" section: |
| |
| Each of these floating-point values is clamped to [0,1] and converted back |
| to a fixed-point value in the manner described in section 2.1.2. |
| |
| Replace the following sentence: |
| |
| Destination (framebuffer) components are taken to be fixed-point values |
| represented according to the scheme in section 2.1.2 (Final Color |
| Processing), as are source (fragment) components. |
| |
| with the following sentences: |
| |
| Destination (framebuffer) components are taken to be fixed-point values |
| represented according to the scheme in section 2.1.2 (Final Color |
| Processing). 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 and hence need to be linearized prior to their use in |
| blending. Each R, G, and B component is linearized by some approximation |
| of the following: |
| |
| { cs / 12.92, cs <= 0.04045 |
| cl = { |
| { ((cs + 0.055)/1.055)^2.4, cs > 0.04045 |
| |
| where cs is the component value prior to linearization and cl is the |
| result. |
| |
| If the value of FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT for the |
| framebuffer attachment corresponding to the destination buffer is SRGB, the |
| R, G, and B destination color values (after conversion from fixedpoint to |
| floating-point) are considered to be encoded for the sRGB color space and |
| hence must be linearized prior to their use in blending. Each R, G, and B |
| component is converted in the same fashion described for sRGB texture |
| components as described below. |
| |
| If the value of FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT is not SRGB, no |
| linearization is performed. |
| |
| The resulting linearized R, G, and B and unmodified A values are |
| recombined as the destination color used in blending computations. |
| |
| ADD new section 4.1.X "sRGB Conversion". With this new section added, |
| understand the "next operation" referred to in the section 4.1.6 |
| (Blending) to now be "sRGB Conversion" (instead of "Dithering"). |
| |
| "If the value of FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT for the |
| framebuffer attachment corresponding to the destination buffer is SRGB, the |
| R, G, and B values after blending are converted into the non-linear sRGB |
| color space by computing: |
| |
| { 0.0, cl <= 0 |
| { 12.92 * c, 0 < cl < 0.0031308 |
| cs = { 1.055 * cl^0.41666 - 0.055, 0.0031308 <= cl < 1 |
| { 1.0, cl >= 1 |
| |
| where cl is the R, G, or B element and cs is the result (effectively |
| converted into an sRGB color space). |
| |
| The resulting cs values for R, G, and B and the unmodified A form a new |
| RGBA color value. If the color buffer is fixed-point, the components of |
| this RGBA color value are clamped to [0,1] and then converted to a fixed- |
| point value. The resulting four values are sent to the subsequent |
| dithering operation." |
| |
| The following should be added to table 4.5 Renderbuffer Image formats: |
| SRGB8_ALPHA8_EXT color_renderable 8 8 8 8 - - |
| |
| Additions to Chapter 5 of the 2.0 Specification (Special Functions) |
| |
| None |
| |
| Additions to Chapter 6 of the 2.0 Specification (State and State Requests) |
| |
| Add the following to 6.1.13's description of |
| GetFramebufferAttachmentParameteriv: |
| |
| If pname is FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT, param will contain |
| the encoding of components of the specified attachment, one of LINEAR or |
| SRGB for linear or sRGB-encoded components, respectively. Only color buffer |
| components may be sRGB-encoded. For the default framebuffer, color encoding |
| is determined by the implementation. For framebuffer objects, components |
| are sRGB-encoded if the internal format of a color attachment is SRGB_EXT, SRGB_ALPHA_EXT, or SRGB8_ALPHA8_EXT. |
| |
| Add the following to 6.2 State Tables |
| |
| FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING z2 GetFramebufferAttachementParameteriv |
| - Encoding of components in the attached image 6.1.13 |
| |
| Additions to the OpenGL Shading Language specification |
| |
| None |
| |
| Additions to the GLX Specification |
| |
| None |
| |
| Errors |
| |
| Relaxation of INVALID_ENUM errors |
| --------------------------------- |
| |
| TexImage2D, TexImage3DOES, and RenderBufferStorage now accept the new |
| tokens as listed in the "New Tokens" section. |
| |
| New Implementation Dependent State |
| |
| None |
| |
| Issues |
| |
| 1) Do we require SRGB8_EXT be supported for RenderbufferStorage? |
| |
| No. Some hardware would need to pad this out to RGBA and instead of adding |
| that unknown for application developers we will simply not support that |
| format in this extension. |
| |
| 2) Should the SLUMINANCE* family be supported? |
| |
| No. Luminance is a rarely used format so we won't support it here. |
| |
| 3) Should we allow the SRGB_*_S3TC_DXT* or any of the other COMPRESSED |
| formats if the implementation supports any of those formats? |
| |
| No since all hardware doesn't support this. It can be added as a separate |
| extension if needed. |
| |
| 4) What is the expectation for mipmap generation on SRGB textures? Issue |
| 24 from EXT_texture_sRGB gives two possible ways, will we leave it |
| similarly undefined, or is this not intended to be supported at all? |
| |
| No. This in not likely to be used much so for simplicity let's not require |
| it. This will generate an INVALID_OPERATION error. |
| |
| Revision History |
| #06 9/14/2011 Maurice Ribble Removed compressed formats and |
| disallowed generateMipmaps |
| #05 9/12/2011 Maurice Ribble Updated issues and added |
| FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING |
| #04 8/18/2011 Maurice Ribble Fixes and issues from Daniel Koch. |
| #03 7/21/2011 Maurice Ribble Language cleanup suggested by Jon |
| Leech and Mark Callow. |
| #02 7/20/2011 Maurice Ribble Minor updates. |
| #01 3/17/2011 Maurice Ribble First draft. |