Проблема с glTranslatef - PullRequest
       1

Проблема с glTranslatef

1 голос
/ 09 марта 2011

Я использую команду glTranslate, чтобы сместить позицию спрайта, который я загружаю из текстуры в моем приложении iPhone OpenGL.Моя проблема в том, что после применения glTranslatef изображение выглядит немного размытым.Когда я комментирую эту строку кода, изображение становится кристально чистым.Как я могу решить эту проблему ???

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Вероятно, вы точно не попали в сетку пикселей экрана. Это приведет к тому, что фильтрация текстур приведет к размытию. Проблема немного сложная: вместо того, чтобы видеть на экране текстуру в виде массива точек, рассматривайте ее как листы бумаги с сеткой (лист текстуры можно растягивать, разрезать, масштабировать). Чтобы все выглядело свежо, сетки должны идеально совмещаться. Координаты текстуры (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 соседние пиксели интерполируются с использованием коэффициента интерполяции, определяющего, насколько далеко они находятся от сетки (с точки зрения непрофессионалов, фактическая реализация выглядит немного иначе).

Итак, как решить вашу проблему: нарисуйте спрайты в проекции / виде модели, которая соответствует области просмотра, используйте только целочисленные координаты для координат вершины и сделайте так, чтобы ваша текстура охватывала всю картинку. Если вы используете только часть координатного диапазона текстуры, все становится еще интереснее, так как один обращается к сетке текстуры, а не к текстовым центрам.

0 голосов
/ 09 марта 2011

Я бы порекомендовал взглянуть на декларацию матрицы вашего вида модели и убедиться, что вызывается glLoadIdentity (), чтобы убедиться, что стек матрицы чистый перед применением преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...