Классическая проблема OpenGL "ничто не отрисовывается" - PullRequest
2 голосов
/ 27 июля 2011

Я знаю, это довольно сложно.Я не могу ничего показать в моем приложении 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().

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Простого вызова функций gl * Pointer недостаточно;Вы должны сказать OpenGL, что он должен извлекать данные из этих конкретных массивов.Для встроенных массивов (glVertexPointer, glColorPointer и т. Д.) Вы используете glEnableClientState(), для конкретного рассматриваемого массива.

Например:

glBindBuffer(GL_ARRAY_BUFFER, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, NULL);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_BYTE, 0, (const GLvoid *)(sizeof(GLfloat) * 2));

Это должно обеспечить лучшие результаты.

Вы также должны использовать glDisableClientState() в этих массивах после того, как закончите рендеринг с ними.

1 голос
/ 27 июля 2011

Вы, кажется, пропустили несколько шагов:

  • VAO переплет
  • включение состояния клиента (VBO), например glEnableClientState(GL_VERTEX_ARRAY)
...