Вероятно, вы точно не попали в сетку пикселей экрана. Это приведет к тому, что фильтрация текстур приведет к размытию. Проблема немного сложная: вместо того, чтобы видеть на экране текстуру в виде массива точек, рассматривайте ее как листы бумаги с сеткой (лист текстуры можно растягивать, разрезать, масштабировать). Чтобы все выглядело свежо, сетки должны идеально совмещаться. Координаты текстуры (0,0) и (1,1) попадают не в центр текселей, а по внешним краям листа текстуры. Таким образом, вам нужно немного сместить и масштабировать для адресации тексельных центров. И то же самое касается размещения целевых четырехугольников на экране, где положение вершины должно быть выровнено с краями экрана, а не с центрами пикселей. Если ваша проекция и матрица просмотра модели не настроены таким образом, что одна единица в пространстве просмотра модели имеет ширину в один пиксель, и проекция заполняет весь экран (или окно просмотра окна), это трудно понять правильно.
Обычно начинается с
glViewport(0,0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// modelview XY range 0..width x 0..height now covers the whole viewport
// (0,0) don't address the lower left pixel but the lower left edge of this
// (width,height) similarily addresses the upper right corner
// drawing a 0..width x 0..height quad with texture coordinates 0..1 x 0..1
// will cover it perfectly
Это будет работать до тех пор, пока четырехугольник будет иметь точно такие же размеры (т. Е. Совпадают позиции вершин) с координатами текстуры и позиции вершин целые.
Теперь интересная часть: что если они не отвечают этим условиям. Затем псевдонимы происходят. В режиме фильтрации GL_NEAREST все по-прежнему выглядит четким, но некоторые строки / строки просто отсутствуют. В режиме фильтрации GL_LINEAR соседние пиксели интерполируются с использованием коэффициента интерполяции, определяющего, насколько далеко они находятся от сетки (с точки зрения непрофессионалов, фактическая реализация выглядит немного иначе).
Итак, как решить вашу проблему: нарисуйте спрайты в проекции / виде модели, которая соответствует области просмотра, используйте только целочисленные координаты для координат вершины и сделайте так, чтобы ваша текстура охватывала всю картинку. Если вы используете только часть координатного диапазона текстуры, все становится еще интереснее, так как один обращается к сетке текстуры, а не к текстовым центрам.