Координаты выборки текстур для визуализации спрайта
Допустим, у нас есть текстура (в данном случае 8x8 пикселей), которую мы хотим использовать в качестве листа спрайта. Одно из подизображений (спрайт) - это субрегион 4x3 внутри текстуры, как на этом изображении:
(Показаны нормализованные текстурные координаты четырех углов)
Теперь, в основном, есть два способа присвоить координаты текстуры кваду размером 4px x 3px так, чтобы он фактически стал искомым спрайтом; Первым и самым простым является выбор текстуры в углах субрегиона:
// Texture coordinates
GLfloat sMin = (xIndex0 ) / imageWidth;
GLfloat sMax = (xIndex0 + subregionWidth ) / imageWidth;
GLfloat tMin = (yIndex0 ) / imageHeight;
GLfloat tMax = (yIndex0 + subregionHeight) / imageHeight;
Хотя при первой реализации этого метода, ок. В 2010 году я понял, что спрайты выглядят слегка «искаженными». После небольшого поиска я наткнулся на сообщение на форумах cocos2d, объясняющее, что «правильный путь» Пример текстуры при рендеринге спрайта это:
// Texture coordinates
GLfloat sMin = (xIndex0 + 0.5) / imageWidth;
GLfloat sMax = (xIndex0 + subregionWidth - 0.5) / imageWidth;
GLfloat tMin = (yIndex0 + 0.5) / imageHeight;
GLfloat tMax = (yIndex0 + subregionHeight - 0.5) / imageHeight;
... и после исправления моего кода я был на некоторое время счастлив. Но где-то на этом пути, и я полагаю, что это связано с внедрением iOS 5, я начал чувствовать, что мои спрайты выглядели не очень хорошо. После некоторого тестирования я снова переключился на «синий». метод (второе изображение), и теперь они, кажется, выглядят хорошо, ноnot always.
Я схожу с ума, или что-то изменилось с iOS 5, связанным с наложением текстур GL ES? Возможно, я делаю что-то еще не так? (например, координаты положения вершины немного не совпадают? Неправильные параметры настройки текстуры?) Но моя база кода не изменилась, поэтому, возможно, я делаю что-то не так с самого начала ...?
Я имею в виду, по крайней мере, с моим кодом, этоfeels как будто "красный" Раньше метод был правильным, но теперь «синий» метод дает лучшие результаты.
Прямо сейчас моя игра выглядит нормально, но я чувствую, что что-то наполовину неправильно, что я должен исправить рано или поздно ...
Есть идеи / опыт / мнения?
ADDENDUM
Чтобы визуализировать спрайт выше, я бы нарисовал квадратик размером 4х3 в ортогональной проекции, где каждой вершине были назначены координаты текстуры, подразумеваемые в коде, упомянутом ранее, например:
// Top-Left Vertex
{ sMin, tMin };
// Bottom-Left Vertex
{ sMin, tMax };
// Top-Right Vertex
{ sMax, tMin };
// Bottom-right Vertex
{ sMax, tMax };
Исходный четырехугольник создается от (-0,5, -0,5) до (+0,5, +0,5); то есть это единичный квадрат в центре экрана, затем масштабированный до размера субрегиона (в данном случае, 4x3), а его центр расположен в целочисленных (x, y) координатах. Я чувствую, что это тоже чем-то связано, особенно когда ширина, высота или оба не равны?
ADDENDUM 2
Я также нашел эту статью, но я все еще пытаюсь собрать ее вместе (она здесь 4:00 утра) http://www.mindcontrol.org/~hplus/graphics/opengl-pixel-perfect.html