Frage

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.

War es hilfreich?

Lösung

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top