Name EXT_texture_snorm Name Strings GL_EXT_texture_snorm Contributors Bill Licea-Kane, AMD Jon Leech, Khronos Mais Alnasser, AMD Nick Haemel, AMD Contact Bill Licea-Kane, (bill.licea-kane 'at' amd.com) Status Draft for OpenGL 3.1 Version Last Modified Date: 2009-07-10 Revision: 5 Number 365 Dependencies OpenGL 3.0 is required. This extension is written against the OpenGL 3.0 specification. Overview Fixed-point textures in unextended OpenGL have integer components, but those values are taken to represent floating-point values in the range [0.0,1.0]. These integer components are considered "unsigned normalized" integers. When such a texture is accessed by a shader or by fixed-function fragment processing, floating-point values are returned in the range [0.0,1.0]. This extension provides a set of new "signed normalized" integer texture formats. These are taken to represent a floating-point value in the range [-1.0,1.0] with an exact 0.0. New Procedures and Functions None New Tokens Accepted by the parameter of TexImage1D, TexImage2D, and TexImage3D: base internal formats RED_SNORM 0x8F90 RG_SNORM 0x8F91 RGB_SNORM 0x8F92 RGBA_SNORM 0x8F93 ALPHA_SNORM 0x9010 LUMINANCE_SNORM 0x9011 LUMINANCE_ALPHA_SNORM 0x9012 INTENSITY_SNORM 0x9013 sized internal formats R8_SNORM 0x8F94 RG8_SNORM 0x8F95 RGB8_SNORM 0x8F96 RGBA8_SNORM 0x8F97 ALPHA8_SNORM 0x9014 LUMINANCE8_SNORM 0x9015 LUMINANCE8_ALPHA8_SNORM 0x9016 INTENSITY8_SNORM 0x9017 R16_SNORM 0x8F98 RG16_SNORM 0x8F99 RGB16_SNORM 0x8F9A RGBA16_SNORM 0x8F9B ALPHA16_SNORM 0x9018 LUMINANCE16_SNORM 0x9019 LUMINANCE16_ALPHA16_SNORM 0x901A INTENSITY16_SNORM 0x901B Returned by GetTexLevelParmeter SIGNED_NORMALIZED 0x8F9C Additions to Chapter 2 of the OpenGL 3.0 Specification (OpenGL Operation) Modify Section 2.19 Colors and Coloring, p. 74 Replace Table 2.10: Component Conversions: GL Type of Conversion to internal floating-point unsigned normalized, signed normalized -------------- ------------------------------------- ubyte /(2^8-1), /(2^7-1) byte (2+1)/(2^8-1), max ( /(2^7-1), -1.0 ) ushort /(2^16-1), /(2^15-1) short (2+1)/(2^16-1), max ( /(2^15-1), -1.0 ) uint /(2^32-1), /(2^31-1) int (2+1)/(2^32-1), max ( /(2^31-1), -1.0 ) half float double Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) Modify Section 3.9 (Texturing), p. 175 Modify second paragraph: The internal data type of a texture may be signed normalized fixed-point, unsigned normalized fixed-point, floating-point, signed integer or unsigned integer, depending on the internal format of the texture. The correspondence between internal format and the internal data type is given in tables 3.16-3.18. Fixed-point and floating-point textures return a floating-point value and integer textures return signed or unsigned integer values. When a fragment shader is active, the shader is responsible for interpreting the result of a texture lookup as the correct data type, otherwise the result is undefined. When not using a fragment shader, unsigned floating-point texture values are assumed, and the results of using either signed normalized fixed-point or integer textures in this case are undefined. Modify Section 3.9.1 (Texture Image Specification), p. 176 (modify last paragraph beginning p. 176): The selected groups are processed exactly as for DrawPixels, stopping just before final conversion. If the of the texture is integer, the components are clamped to the representable range of the internal format: for signed formats, this is [-2^(n-1), 2^(n-1)-1] where n is the number of bits per component; for unsigned formats, the range is [0, 2^n-1]. For R, G, B, and A, if the of the texture is fixed-point, the components are clamped to the representable range of the internal format: for signed normalized formats, this is [-1.0, 1.0]; for unsigned normalized formats, this is [0.0, 1.0]. Otherwise, the components are not modified. (add the following required Color formats (texture-only), p. 179) - R16_SNORM, RG16_SNORM, RGB16_SNORM, RGBA16_SNORM, R8_SNORM, RG8_SNORM, RGB8_SNORM, RGBA8_SNORM (add the following to table 3.16, beginning p. 181) Sized Base R G B A L I Internal Format Internal Format bits bits bits bits bits bits ----------------------- --------------------- ---- ---- ---- ---- ---- ---- R8_SNORM R_SNORM 8 RG8_SNORM RG_SNORM 8 8 RGB8_SNORM RGB_SNORM 8 8 8 RGBA8_SNORM RGBA_SNORM 8 8 8 8 ALPHA8_SNORM ALPHA8_SNORM 8 LUMINANCE8_SNORM LUMINANCE8_SNORM 8 LUMINANCE8_ALPHA8_SNORM LUMINANCE8_ALPHA8_SNORM 8 8 INTENSITY8_SNORM INTENSITY8_SNORM 8 R16_SNORM R_SNORM 16 RG16_SNORM RG_SNORM 16 16 RGB16_SNORM RGB_SNORm 16 16 16 RGBA16_SNORM RGBA_SNORM 16 16 16 16 ALPHA8_SNORM ALPHA8_SNORM 16 LUMINANCE16_SNORM LUMINANCE16_SNORM 16 LUMINANCE16_ALPHA16_SNORM LUMINANCE16_ALPHA16_SNORM 16 16 INTENSITY16_SNORM INTENSITY16_SNORM 16 Table 3.16: Correspondence of sized internal formats to base internal formats, internal data type and desired component resolutions for each sized internal format. The component resolution prefix indicates the internal data type: is floating point, is signed integer, is unsigned integer, and no prefix is signed or unsigned normalized fixed-point. Modify Section 3.12.2 Shader Execution (modify Shader Outputs paragraph, p. 234) XXXXX - Is this section broken? The OpenGL Shading Language specification describes the values that may be output by a fragment shader. These outputs are split into two categories, user-defined varying out variables and built-in variables. The built-in variables are gl_FragColor, gl_FragData[n], and gl_FragDepth. If fragment color clamping is enabled and the color buffer has a unsigned normalized fixed-point format, signed normalized fixed-point format, or floating-point format, the final fragment color, fragment data, or varying out variable values written by a fragment shader are clamped to the range [0, 1] and are optionally converted to normalized fixed-point as described in section 2.19.9. Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment Operations and the Frame Buffer) Modify Chapter 4 Introduction, (p. 239) (modify second paragraph, p. 239) Each pixel in a color buffer consists of either a single unsigned integer color index or up to four color components. The four color components are named R, G, B, and A, in that order; color buffers are not required to have all four color components. R, G, B, and A components may be represented as unsigned normalized fixed-point, signed normalized fixed-point, floating-point, signed integer, or unsigned integer values; all components must have the same representation.... XXXX - Clear section needs changing? Additions to Chapter 6 of the OpenGL 2.0 Specification (State and State Requests) Modify Section 6.1.3 (Enumerated Queries), p. 318 (Modify beginning paragraph starting on p. 318) For texture images with uncompressed internal formats, queries of value of TEXTURE_RED_TYPE, TEXTURE_GREEN_TYPE, TEXTURE_BLUE_TYPE, TEXTURE_ALPHA_TYPE, TEXTURE_LUMINANCE_TYPE, TEXTURE_DEPTH_TYPE, and TEXTURE_INTENSITY_TYPE return the data type used to store the component. Types NONE, UNSIGNED_NORMALIZED, SIGNED_NORMALIZED, FLOAT, INT,and UNSIGNED_INT respectively indicate missing, unsigned normalized integer, signed normalized integer, floating-point, signed unnormalized integer, and unsigned unnormalized integer components.... GLX Protocol TBD Errors Issues 1 - Should the internalformat enums contain an underscore? RESOLVED: Yes. _SNORM internal format modifier is nearly unreadable without it. (Especially for sized formats.) 2 - What are the required signed normalized formats? RESOLVED: We require 8 and 16 bit R, RG, RGB, RGBA texturing. It follows that these are filterable. We are silent about requiring R, RG, RBA and RGBA rendering. This is an implementation choice. Note that some "OpenGL 3.0 target hardware" (multiple implementations) have blending limitations with signed normalized color formats. We are restricted to "OpenGL 3.0 target hardware" for 3.1 candidates. 3 - Shader outputs broken? Final color processing (Chapter 2), Clamping (Several) and conversion to framebuffer are intertwined at several places in the spec now. Some of the statements in this section appear to conflict with statements in other sections. 4 - Clear? Do we need to be able to clear a signed normalized fixed-point buffer to the full range of [-1.0,1.0]? If so, any changes needed here? 5 - Should this "extension spec" be updated to accurately reflect the final 3.0 -> 3.1 deltas? Resolved - Ideally, but not now. Jon made many major structural changes to the core spec in 3.0 -> 3.1. See the core 3.1 spec with differences tracked for details. Revision History: Date: 2009-07-10 Revision: 5 (Jon Leech) Assign extension number, minor formatting cleanups for registry. Date: 2009-04-29 Revision: 4 (gsellers) Add contributors. Date: 2009-04-22 Revision: 3 (wwlk) Add token values, for R,RG,RGB, RGBA and for "legacy" formats alpha, luminace, luminance alpha and intensity. Added unsigned conversions. Fixed typos in enums: LUMINANCE_ALPHA8_SNORM -> LUMINANCE8_ALPHA8_SNORM LUMINANCE_ALPHA16_SNORM -> LUMINANCE16_ALPHA16_SNORM Date: 2009-03-17 Revision: 2 (wwlk) Fixed enum inconsistencies Date: 2008-10-30 Revision: 1 (wwlk) Initial version