Координаты выборки текстуры для рендеринга спрайта

Допустим, у нас есть текстура (, в данном случае 8x8 пикселей ), которую мы хотим использовать в качестве листа спрайтов. Одно из вложенных -изображений (спрайт )представляет собой подобласть 4x3 внутри текстуры, как на этом изображении:

enter image description here

(Показаны нормализованные текстурные координаты четырех углов )

. Теперь есть два основных способа назначить координаты текстуры четырехугольнику размером 4px x 3px -, чтобы он фактически стал спрайтом, который мы ищем; Первый и самый простой — сэмплировать текстуру в углах субрегиона :

enter image description here

// Texture coordinates

GLfloat sMin = (xIndex0                  ) / imageWidth;
GLfloat sMax = (xIndex0 + subregionWidth ) / imageWidth;
GLfloat tMin = (yIndex0                  ) / imageHeight;
GLfloat tMax = (yIndex0 + subregionHeight) / imageHeight;

. Хотя при первом внедрении этого метода ок. В 2010 году я понял, что спрайты выглядят слегка «искаженными». После недолгих поисков я наткнулся на сообщение на форумах cocos2d, в котором объяснялось, что «правильный способ» выборки текстуры при рендеринге спрайта таков:

enter image description here

// 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, я начал чувствовать, что мои спрайты выглядят не очень хорошо. После некоторого тестирования я снова переключился на «синий» метод (второе изображение )и теперь они вроде выглядят хорошо, но не всегда .

Я схожу с ума, или что-то изменилось в iOS 5, связанное с наложением текстур GL ES? Возможно, я делаю что-то еще не так? (например, координаты положения вершины немного не совпадают? Неправильные параметры настройки текстуры? )Но моя кодовая база не изменилась, так что, возможно, я с самого начала делаю что-то не так...?

Я имею в виду, по крайней мере, с моим кодом кажется , что «красный» метод раньше был правильным, но теперь «синий» метод дает лучшие результаты.

Прямо сейчас моя игра выглядит нормально, но я чувствую, что что-то наполовину -не так, и я должен исправить это рано или поздно...

Есть идеи/опыт/мнения?

ПРИЛОЖЕНИЕ

Чтобы визуализировать приведенный выше спрайт, я бы нарисовал четырехугольник размером 4x3 в орфографической проекции, где каждой вершине были назначены координаты текстуры, подразумеваемые в коде, упомянутом ранее, например:

// 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 ). Я чувствую, что это тоже имеет какое-то отношение, особенно когда ширина, высота или оба не равны?

ПРИЛОЖЕНИЕ 2

Я также нашел эту статью, но я все еще пытаюсь собрать ее воедино (здесь 4 :00) http://www.mindcontrol.org/~hplus/graphics/opengl-pixel-perfect.html

11
задан Nicolas Miari 12 July 2012 в 19:03
поделиться