Обратите внимание, что такие вещи, как glBegin
, glEnd
устарели (даже glVertexPointer
и glEnableClientState
).Прочитайте о конвейере фиксированных функций и Спецификация вершин .
Но на основании вашего кода я рекомендую определить массив данных вершин (glVertexPointer
) и на стороне клиента (glEnableClientState
), чтобы решить вашу проблему.Далее определите массивы индексов и используйте glDrawElements
для визуализации (индексирования) примитивов из данных массива.
Определение координат вершин:
GLfloat water_height = -0.5f;
GLfloat vertices[] =
{
-1.0f, -1.0f, -1.0f, // 0
1.0f, -1.0f, -1.0f, // 1
1.0f, -1.0f, 1.0f, // 2
-1.0f, -1.0f, 1.0f, // 3
-1.0f, 1.0f, -1.0f, // 5
1.0f, 1.0f, -1.0f, // 6
1.0f, 1.0f, 1.0f, // 7
-1.0f, 1.0f, 1.0f, // 8
-1.0f, water_height, -1.0f, // 9
1.0f, water_height, -1.0f, // 10
1.0f, water_height, 1.0f, // 11
-1.0f, water_height, 1.0f // 12
};
Определение индексов для"водяные" квады:
// 6 quad indices for the 6 sides of the water cube
GLuint water_indices[] =
{
0, 1, 2, 3,
0, 1, 9, 8,
1, 2, 10, 9,
2, 3, 11, 10,
3, 0, 8, 11,
8, 9, 10, 11
};
Определите индексы для краев:
// 8 edges for the part of the cube which is not filled with water
GLuint edge_indices[] =
{
4, 5,
5, 6,
6, 7,
7, 4,
4, 8,
5, 9,
6, 10,
7, 11
};
Нарисуйте квадраты и линии:
glVertexPointer( 3, GL_FLOAT, 0, vertices );
glEnableClientState( GL_VERTEX_ARRAY );
glColor4f( 0.3f, 0.5f, 1.0f, 1.0f );
glDrawElements( GL_QUADS, 6 * 4, GL_UNSIGNED_INT, water_indices );
glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
glDrawElements( GL_LINES, 8 * 2, GL_UNSIGNED_INT, edge_indices );
glDisableClientState( GL_VERTEX_ARRAY );
Предварительный просмотр: