Współrzędne próbkowania tekstur do renderowania ikonek

Powiedzmy, że mamy teksturę (w tym przypadku 8x8 pikseli), którą chcemy wykorzystać jako arkusz sprite. Jeden z obrazów podrzędnych (ikonka) jest subregionem 4x3 wewnątrz tekstury, jak na tym obrazku:

(Wyświetlane są znormalizowane współrzędne tekstury czterech rogów)

Teraz istnieją zasadniczo dwa sposoby przypisywania współrzędnych tekstury do kwadratu o rozmiarze 4px x 3px, aby skutecznie stał się ikonką, której szukamy; Pierwszym i najprostszym jest próbkowanie tekstury w rogach subregionu:

// Texture coordinates

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

Chociaż przy pierwszej implementacji tej metody, ca. 2010, zdałem sobie sprawę, że sprite wyglądały na nieco „zniekształcone”. Po kilku poszukiwaniach natknąłem się na post na forach cocos2d wyjaśniający, że „właściwym sposobem” próbkowania tekstury podczas renderowania ikonki jest:

// 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;

... i po naprawieniu kodu byłem szczęśliwy przez chwilę. Ale gdzieś po drodze, i wierzę, że jest to związane z wprowadzeniem iOS 5, zacząłem czuć, że moje duszki nie wyglądają dobrze. Po kilku testach wróciłem do metody „niebieskiej” (drugi obraz) i teraz wyglądają dobrze, alenie zawsze.

Czy szaleję, czy coś się zmieniło w przypadku iOS 5 związanego z mapowaniem tekstur GL ES? Może robię coś innego źle? (np. współrzędne położenia wierzchołków są nieco wyłączone? Nieprawidłowe parametry konfiguracji tekstury?) Ale moja baza kodu nie zmieniła się, więc może robię coś złego od początku ...?

To znaczy, przynajmniej z moim kodemczuje tak jakby „czerwona” metoda była poprawna, ale teraz „niebieska” metoda daje lepsze wyniki.

W tej chwili moja gra wygląda dobrze, ale czuję, że jest coś na wpół złego, które muszę naprawić wcześniej czy później ...

Jakieś pomysły / doświadczenia / opinie?

UZUPEŁNIENIE

Aby wyrenderować ikonkę powyżej, narysowałbym quad mierzący 4x3 w rzucie ortograficznym, z każdym wierzchołkiem przypisanym teksturom implikowanym w kodzie wspomnianym wcześniej, takim jak ten:

// Top-Left Vertex
{ sMin, tMin };

// Bottom-Left Vertex
{ sMin, tMax };

// Top-Right Vertex
{ sMax, tMin };

// Bottom-right Vertex
{ sMax, tMax };

Oryginalny quad jest tworzony od (-0,5, -0,5) do (+0,5, +0,5); tj. jest to kwadrat jednostkowy na środku ekranu, a następnie skalowany do rozmiaru podregionu (w tym przypadku 4x3), a jego środek znajduje się na współrzędnych całkowitych (x, y). Czuję, że to ma coś do zrobienia, zwłaszcza gdy szerokość, wysokość lub obie nie są równe?

DODATEK 2

Znalazłem także ten artykuł, ale nadal próbuję go połączyć (jest tutaj 4:00)http://www.mindcontrol.org/~hplus/graphics/opengl-pixel-perfect.html

questionAnswers(1)

yourAnswerToTheQuestion