Opengl Geometry shader integer texture fetch fails
geometry-shader, integer, opengl, opengl-3, texture-mapping
Solution
Found the solution through liberal sprinkling of glGetErrors. The error was in every glTexImage in this code example - apparently, for an integer texture you must not use GL_RGBA but GL_RGBA_INTEGER.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data);
This now works. The texture fetches are also OK.
Problem
I'm trying to sample an integer texture from my geometry shader running on a GeForce 330m. It seems to return other values than I load into the texture. I use this code (basically) for creating and loading the texture: ``` glGenTextures( 1, &textureId ); glBindTexture( GL_TEXTURE_2D, textureId ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture( GL_TEXTURE_2D, 0); glBindTexture( GL_TEXTURE_2D, textureId ); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_INT, <some 0-initialized large enough buffer>); glBindTexture( GL_TEXTURE_2D, 0); glBindTexture( GL_TEXTURE_2D, textureId ); int data[] = { 3, 0, 36, 400 }; glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 3, 1, 1, GL_RGBA, GL_INT, data); glBindTexture( GL_TEXTURE_2D, 0); ``` The idea is that one pixel in specific is set to have a w-value of 400. I then use this in my geometry shader: ``` #version 330 #extension GL_EXT_gpu_shader4 : require uniform isampler2D models; void main() { ivec4 modelstats4 = texelFetch2D(models, ivec2(0, 3), 0); // ivec4 modelstats4 = ivec4(3, 0, 36, 400); if (modelstats4.w > height) { // emit something } } ``` Using the commented-out fixed values that should be equal result in something being emitted (IE, one point). If I use the actual texel fetch it does not return anything. All values that I know of that can have an impact are now hardcoded so I'm at a loss why this doesn't work. This is not the full code (OO setup, quite a lot to look through) but these are the relevant OpenGL calls with applicable data.