GL EXT texture integer
GL_EXT_texture_integer adds some additional internal formats. It is core in GL 3.0, so you can drop the postfix if GL 3.0 is supported.
This extension requires http://opengl.org/registry/specs/EXT/gpu_shader4.txt when you want to sample the texture from GLSL.
This extension is also core in GL 3.0.
Create The Texture[edit]
Here we are creating a 2D texture with GL_LUMINANCE16UI_EXT internal format. We won't be using mipmapping so that the values will be perfect. We will use NEAREST as the texture filtering mode.
glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_2D, textureID); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE16UI_EXT, width, height, 0, GL_LUMINANCE_INTEGER_EXT, GL_UNSIGNED_SHORT, pixels);
For cleanup
glDeleteTextures(1, &textureID);
Sampling The Texture From GLSL[edit]
GL_EXT_gpu_shader4 defines new samplers such as usampler2D, usampler3D, usamplerCube, usampler2DRect, isampler2D, isampler3D, isamplerCube, isampler2DRect, etc.
For example, usampler2D would be for sampling an unsigned integer texture such as a GL_LUMINANCE16UI_EXT or GL_LUMINANCE32UI_EXT.
For example, isampler2D would be for sampling an signed integer texture such as a GL_LUMINANCE16I_EXT or GL_LUMINANCE32I_EXT.
Sampling from a fragment shader should work. Not sure if sampling from VS or GS is supported with these formats. Consult the IHVs manuals.
We will need GLSL 1.30.
Example:
//VERTEX SHADER #version 130 in vec3 InVertex; in vec2 InTexCoord0; uniform mat4 ProjectionModelviewMatrix; smooth out vec2 TexCoord0; void main() { gl_Position = ProjectionModelviewMatrix * vec4(InVertex, 1.0); TexCoord0 = InTexCoord0; }
Notice that the above is a GLSL 1.30 vertex shader, therefore we don't use varying. We use out.
Also, we are using the default interpolater mode : smooth.
//FRAGMENT SHADER #version 130 #extension GL_EXT_gpu_shader4 : enable //Include support for this extension, which defines usampler2D uniform usampler2D Texture0; smooth in vec2 TexCoord0; void main() { uint texel = texture2D(Texture0, TexCoord0).x; if(texel == 1000U) FragColor = vec4(0.0, 0.0, 1.0, 1.0); else FragColor = vec4(1.0, 0.0, 0.0, 1.0); }
The fragment shader defines its own output variable. Here we named it FragColor. This is required for GLSL 1.30.