Выборка целочисленных данных текстуры без знака в шейдере

Я хочу отобразить целочисленную текстуру без знака с помощью фрагментного шейдера, используя следующий код:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R8UI, width, height, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, data);

и часть кода фрагментного шейдера:

#version 330
uniform usampler2D tex;
void main(void){
    vec3 vec_tex;
    vec_tex = (texture(tex), TexCoordOut).r
}

В Руководстве по программированию OpenGL написано, что если я хочу получать целые числа в шейдере, то я должен использовать целочисленный тип выборки, целочисленный внутренний формат и целочисленный внешний формат. формат и тип. Здесь используется GL_R8UI как внутренний формат, GL_RED_INTEGER как внешний формат, GL_UNSIGNED_BYTE как тип данных. Я также использую usampler2D в шейдере. Но когда программа начинает рендерить файл, всегда вылезает ошибка неявное приведение из "int" в "uint". Похоже, что данные текстуры хранятся как int, и сэмплер без знака не может их преобразовать. Но я использовал GL_R8UI в качестве внутреннего формата, поэтому данные текстуры должны храниться без знака. почему неподписанный сэмплер получает только подписанный int? Как я могу решить эту проблему?


person hfg    schedule 21.04.2014    source источник
comment
Вы знаете, что vec3 — это число с плавающей запятой, верно? Если вы хотите сохранить результаты выборки из usampler2D, вам, вероятно, следует использовать uvec3. Даже тогда, если это буквально ваш шейдер, он должен генерировать более серьезную ошибку. texture (...) требует координат текстуры, а TexCoordOut даже не определено.   -  person Andon M. Coleman    schedule 22.04.2014


Ответы (1)


Вызов функции текстуры неверен, во-вторых, функция текстуры возвращает значения с плавающей запятой, которые необходимо обрабатывать в шейдере путем деления компонентов RGBA на 255,0 (как вы используете GL_R8UI), а также возвращать и фрагментировать вывод цвета.

uniform usampler2D tex;
out uvec3 OutColor;
void main(void){
    uvec3 vec_tex;
    vec_tex = texture(tex, TexCoordOut)
    OutColor = vec3(float(vec_tex.r)/255, float(vec_tex.g)/255, float(vec_tex.b)/255)
}
person Sunil Naik    schedule 26.08.2015