Сбой выборки целочисленной текстуры шейдера геометрии Opengl

Я пытаюсь получить целочисленную текстуру из своего геометрического шейдера, работающего на GeForce 330m. Кажется, он возвращает другие значения, чем я загружаю в текстуру. Я использую этот код (в основном) для создания и загрузки текстуры:

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);

Идея состоит в том, что для одного конкретного пикселя задано значение w, равное 400. Затем я использую это в своем шейдере геометрии:

#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
   }
}

Использование закомментированных фиксированных значений, которые должны быть равными, приводит к тому, что что-то выдается (IE, один балл). Если я использую фактическую выборку текселей, она ничего не возвращает. Все известные мне значения, которые могут оказать влияние, теперь жестко закодированы, поэтому я не понимаю, почему это не работает. Это не полный код (настройка OO, довольно много, чтобы просмотреть), но это соответствующие вызовы OpenGL с соответствующими данными.


person dascandy    schedule 07.04.2012    source источник
comment
Вы должны ответить на свой вопрос или удалить его. Потому что он хранится только в списке вопросов без ответов :)   -  person kravemir    schedule 19.05.2012
comment
Спасибо, Миро, не знал.   -  person dascandy    schedule 09.06.2012


Ответы (1)


Нашел решение через обильную окропление glGetErrors. В этом примере кода ошибка была в каждом glTexImage — видимо, для целочисленной текстуры нужно использовать не GL_RGBA, а GL_RGBA_INTEGER.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data);

Теперь это работает. С выборкой текстур тоже все в порядке.

person dascandy    schedule 09.06.2012