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

Я пытаюсь использовать 2d текстуру в качестве справочной таблицы для индексации в большую текстуру. Затем нанесите текстуру на карту значения цвета на четырехугольник. Проблема, с которой я сталкиваюсь, заключается в том, что большая текстура кажется меньше, чем ее собственное разрешение, когда я ее пробую. Например, у меня есть большая текстура 4k x 4k. Текстура поиска выбирает область 1k x 1k большой текстуры. Затем текстура отображает результат в квад, который заполняет область просмотра, которая также имеет ширину 1 КБ и высоту 1 КБ. Я ожидаю увидеть карту 1: 1 между текстурированным квадратом и частью 1k x 1k оригинальной текстуры 4k x 4k. Тем не менее, текстурированный квадрат очень псевдоним. Похоже, что текстура 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;
}

1 ответ

Решение

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

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

Другие вопросы по тегам