Выборка целых чисел без знака из 1D текстуры с использованием целочисленных координат текстуры

Я хочу передать большой массив unsigned short кортежи (прямоугольные геометрии) к моему фрагментному шейдеру и возможность сэмплировать их как есть, используя целочисленные текстурные координаты, для этого я пытаюсь использовать 1D текстуру следующим образом, но получаю только пустые (0) значения.

Создание и инициализация текстуры:

GLushort data[128][2];
// omitted array initialization

GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_1D, tex);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAX_LEVEL, 0);
glTexImage1D(
    GL_TEXTURE_1D,
    0,
    GL_RG16UI,
    128,
    0,
    GL_RG_INTEGER,
    GL_UNSIGNED_SHORT,
    data
);

Передача текстуры в шейдер:

int tex_unit = 0;
glActiveTexture(GL_TEXTURE0 + tex_unit);
glBindTexture(GL_TEXTURE_1D, tex);
glUniform1iv(loc, 1, &tex_unit);

Отладка фрагмента шейдера:

#version 330 core
out vec4 out_color;

uniform usampler1D tex;

void main()
{
    uvec4 rect = texelFetch(tex, 70, 0);
    uint w = rect.r;
    uint h = rect.g;
    out_color = w > 0u ? vec4(1) : vec4(0);
}

Вещи, которые работают наверняка: ненулевые данные в data настройка массива, блока изображения текстуры и равномерная инициализация сэмплера.

OpenGL 4.1, OSX 10.11.6 "El Capitan"

1 ответ

После некоторого поиска в Google и методом проб и ошибок я обнаружил этот пост, в котором говорится, что с целочисленными форматами текстур (например, GL_RG16UI внутренний формат) GL_LINEAR фильтрация не может быть указана и только GL_NEAREST применяется, таким образом, все работает со следующим кодом создания текстуры:

GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_1D, tex);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAX_LEVEL, 0);
glTexImage1D(
    GL_TEXTURE_1D,
    0,
    GL_RG16UI,
    128,
    0,
    GL_RG_INTEGER,
    GL_UNSIGNED_BYTE,
    data
);
Другие вопросы по тегам