Проще говоря, текстура не будет искажена, потому что вы будете выбирать только три координаты текстуры - по одной на вершину. Вам нужно будет использовать два треугольника, как описано выше, и «обрезать» различные части текстуры.
Прошу прощения за мое ужасное использование искусства ASCII здесь и в остальной части этого поста:
Polygon Texture ADB ACD
A-----C | x-----x | x | x-----x
|\ | | | ___ | | | | ___ |
| \ | | |<o.o>| | |<o | .o>|
| \ | | | ### | | | ## | # |
| \ | | | -|- | | | -|- | |
| \| | | / \ | | | / \ | |
B-----D | x-----x | x-----x | x
Вы бы сделали два треугольника - ADB и ACD. Точка A отображается в верхнем левом углу текстуры, B - в нижнем левом, C - в верхнем правом и D - в нижнем правом. Если вы отображаете только один треугольник или другой, вы получаете только половину спрайта (или текстуры, для более сложной формы). То же самое относится к большим или более сложным полигонам. Текстура может быть единым фрагментом, но координаты текстуры каждой вершины должны разрезать ее так же, как и сама геометрия.
Более сложный пример, шестиугольник:
a b
___
/ \
f / . \ c
\ g /
\___/
e d
Если вы добавите среднюю точку «G» и нарежете ее на шесть треугольников (ABG, BCG, CDG и т. Д.), Вам нужно будет убедиться, что любая используемая вами текстура разрезана по координатам матч. Это не имеет значения, если вы просто используете GL_TRIANGLES
, так как проще всего оставить текстуру в ее шестиугольной форме, но как только вы начнете рисовать полосы или вееры, вы можете переворачивать, наклонять или дублировать, если вы не сохраните из-за порядка прорисовки закрыть трек того, какая вершина отображается в какой части текстуры.
В качестве отступления, если вы просто заинтересованы в двухмерных квадратах с выравниванием по экрану, для чего обычно нужны спрайты, используйте расширение OES_Draw_Texture , доступное на iPhone, и избавьте себя от душевной боли, пока набирает значительный прирост скорости.
int rect[4] = {0, 0, 64, 64};
glBindTexture(GL_TEXTURE_2D, texMario);
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);
glDrawTexiOES(playerX, playerY, spriteZ, width, height);
rect
определяет координаты текстуры, которую вы собираетесь вырезать (в пикселях, так что это будет спрайт 64x64), а затем фактический вызов glDrawTexiOES
выводит его прямо в представление экрана с его нижний левый угол на playerX и playerY.
Боже, даже здесь я чувствую "д-р". Я прошу прощения за это.