Точно так же, как и другие, я не думаю, что есть хитрость, чтобы отобразить ваши четырехугольные текстуры на треугольники.
Основная проблема, с которой вы сталкиваетесь, из-за разрывов в текстурных координатах для каждого угла. Если один угол равен некоторым UV-координатам {u, v} для одной грани, это не значит, что он будет иметь такое же значение для двух других граней, которые разделяют вершину. Можно найти отображение так, чтобы UV было уникальным в каждом углу куба (совместно используемом 3 гранями) и чтобы все 4 значения UV ({0,0}, {1,0}, {1,1} и {0,1}) присутствуют на каждой грани, но тогда некоторые текстуры будут полностью искажены. Попробуйте проверить это на листе бумаги: {1,1} не всегда противоположно {0,0}.
Проще всего начать с явного объявления 6 квадов, каждый из которых состоит из 2 треугольников. Это дает вам в общей сложности 24 вершины (24 позиции и 24 текс-координаты, с чередованием или нет) и 36 индексов (6 четырехугольников, состоящих из двух треугольников, 6 * 2 * 3 = 36).
Вот ваш код, обновленный для отображения куба (возможно, возникла некоторая проблема с намоткой, поэтому я, конечно, отключил выборку лица):
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
static const float vertices[] = {
0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f,
1.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 1.0f,
0.0f, 0.0f, 1.0f
};
static const int vertexCnt = 6 * 4;
static const GLubyte cube[] = {
0, 1, 2, 1, 2, 3,
4, 5, 6, 5, 6, 7,
8, 9, 10, 9, 10, 11,
12, 13, 14, 13, 14, 15,
16, 17, 18, 17, 18, 19,
20, 21, 22, 21, 22, 23
};
static const GLfloat texCoords[] = {
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 0.0f,
0.0f, 1.0f
};
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glLoadIdentity();
//glTranslatef(0.0f, 0.0f, -3.0f);
glRotatef(3.1415927f, 1.0f, 1.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, spriteTexture);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, cube);