Я знаю, это довольно сложно.Я не могу ничего показать в моем приложении OpenGL - все, что я вижу, это пустой видовой экран.
Когда я впервые начал писать приложение, я вручную рисовал вершины (используя GL_QUADS
) и всеработал нормально.Тогда я решил переключиться на VBO ( V ertex B uffer O bjects) .Теперь ничего не работает.
Вот структура для вершин:
struct SimpleVertex
{
GLfloat x, y;
GLbyte r, g, b, a;
};
Как видите, она очень проста - координаты x и y для вершин и данные цвета RGBA.Вот код, который заполняет буфер вершин и индексов:
const SimpleVertex rect_vertices[] = {
{ -0.8, 0.8, 0, 255, 0, 128 },
{ 0.8, 0.8, 0, 255, 0, 128 },
{ 0.8, -0.8, 0, 255, 0, 128 },
{ -0.8, -0.8, 0, 255, 0, 128 }
};
const GLuint rect_indices[] = {
0, 1, 2, 3
};
GLuint vertices;
GLuint indices;
glGenBuffers(1, &vertices);
glBindBuffer(GL_ARRAY_BUFFER, vertices);
glBufferData(GL_ARRAY_BUFFER,
sizeof(rect_vertices),
rect_vertices,
GL_STATIC_DRAW);
glGenBuffers(1, &indices);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(rect_indices),
rect_indices,
GL_STATIC_DRAW);
И, наконец, что не менее важно, вот код, который должен рисовать прямоугольник:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindBuffer(GL_ARRAY_BUFFER, vertices);
glVertexPointer(2, GL_FLOAT, 0, NULL);
glColorPointer(4, GL_BYTE, 0,
(const GLvoid *)(sizeof(GLfloat) * 2));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, NULL);
glDisable(GL_BLEND);
Iне могу понять, почему ничего не делается.Данные по вершинам и цветам практически не изменились по сравнению с предыдущей версией, которая использовала glVertex2f()
.