Выборка целых чисел без знака из 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
);