Как создать образец текстуры в собственном разрешении в фрагментном шейдере glsl

Я пытаюсь использовать 2-мерную текстуру в качестве таблицы поиска для индексации в более крупную текстуру. Затем текстура отображает значение цвета на четырехугольник. Проблема, с которой я столкнулся, заключается в том, что большая текстура кажется меньше, чем ее собственное разрешение, когда я ее пробую. Например, у меня большая текстура 4k x 4k. Текстура поиска выбирает область размером 1k x 1k большой текстуры. Затем текстура отображает результат в четырехугольник, который заполняет область просмотра, которая также имеет ширину 1k x 1k высоту. Я ожидаю увидеть карту 1: 1 между текстурированным четырехугольником и частью исходной текстуры 4k x 4k размером 1k x 1k. Тем не менее, текстурированный четырехугольник очень искажен. Похоже, что текстура 4k x 4k была уменьшена до текстуры 1k x 1k, а моя карта поиска сэмплирует часть этой текстуры размером 512 x 512.

Другими словами, это выглядит так, как если бы я делал выборку из текстуры, размер которой был изменен, чтобы соответствовать области просмотра 1k x 1k, а не из исходной текстуры 4k x 4k. Есть ли проблема с тем, почему я подхожу к этой проблеме?

Вот мой вершинный шейдер:

uniform mat4 pvm;

void main()
{   
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

and fragment shader:

uniform sampler2D image;  //The large texture
uniform sampler2D map;    //The lookup texture

void main()
{

    vec4 pos = texture(map,(gl_TexCoord[0].st * vec2(-1.0, 1.0)));  //Flip the origin

    vec4 color = texelFetch(image,ivec2(pos.s*4096,pos.t*4096),0);  
    gl_FragColor = color;
}

person user2964105    schedule 07.11.2013    source источник


Ответы (1)


Неудивительно, что сглаживание является заметной проблемой, texelFetch (...) отключает фильтрацию, включая сопоставление mip. Вам придется реализовать это самостоятельно, если вы воспользуетесь этой функцией.

Типичный вариант использования texelFetch (...) - отключить фильтрацию текстур (не то, что вы хотите здесь) или получить конкретный образец из мультисэмпловой текстуры (также не то, что вы хотите). Лучше использовать нормализованные координаты текстуры и обычный texture (...), если вы хотите сглаживание текстуры.

person Andon M. Coleman    schedule 07.11.2013
comment
Привет, Андон, я также пытался просто использовать: vec4 color = texture (image, vec2 (pos.s, pos.t)); вместо texelfetch. Результат идентичен texelFetch. - person user2964105; 07.11.2013
comment
@ user2964105: Какой у вас фильтр текстур для текстур, которые вы связали с семплерами map и image? Если фильтр карты является ближайшим соседом, этого следовало ожидать, потому что вместо интерполяции координат вы выбираете ближайшую целочисленную координату. Я не могу сказать наверняка, но я полагаю, что вам нужен плавный переход между соседними текселями, а не резкая привязка к сетке. Если вы используете линейный фильтр min / mag для обеих текстур, вы должны получить намного меньше наложения. Фактически, фильтр текстуры вашей map текстуры здесь более важен, чем фильтр image - person Andon M. Coleman; 08.11.2013
comment
@ user2964105: Все сводится к тому, как генерируются координаты текстуры. Обычно, если вы не использовали текстуру поиска для поиска координат, они будут плавно интерполироваться по вашему многоугольнику, но поскольку ваши координаты зависят от выборки из другой текстуры, поведение зависит от вашего фильтра текстуры. - person Andon M. Coleman; 08.11.2013
comment
Благодарю за ваш ответ. Я считаю, что обнаружил проблему. Программа была создана потому, что я использовал размер GL_BYTE для каждого цвета в текстуре поиска. Это не дало мне достаточно мелкой детализации для извлечения из большой текстуры. После того, как я перешел на GL_Float, проблема исчезла. - person user2964105; 08.11.2013