OpenGL Basic IBO / VBO не работает - PullRequest
0 голосов
/ 11 февраля 2012

Я следовал инструкциям, перечисленным здесь .

Я хочу нарисовать один треугольник, используя объект индексного буфера, объект буфера вершин, мой собственный вершинный и фрагментный шейдер и мою собственную структуру вершин.

Моя проблема в том, что когда я рисую, ничего не появляется. Я не уверен, что я делаю неправильно. Мои шейдеры работают нормально, я тестировал их без использования ibo / vbo, и они в порядке.

Вот мой код:

GLuint  vao[1], vbo_vertex[1], index_buffer[1];

typedef struct{
    GLfloat x,y,z;      // Vertex.
    GLfloat r,g,b;  // Colors.
} spicyVertex;

void initializeBuffers(){

    spicyVertex* simple_triangle = new spicyVertex[3];
    // V0 - bottom
    simple_triangle[0].x = 0.0f;
    simple_triangle[0].y = -0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // V1 - top right
    simple_triangle[0].x = 0.5f;
    simple_triangle[0].y = 0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // V2 - top left
    simple_triangle[0].x = -0.5f;
    simple_triangle[0].y = 0.5f;
    simple_triangle[0].z = 0.0f;
    simple_triangle[0].r = 1.0f;
    simple_triangle[0].g = 0.0f;
    simple_triangle[0].b = 0.0f;

    // Setup the vertex buffer data.
    glGenBuffers(1, &vbo_vertex[0]);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]);
    glBufferData(GL_ARRAY_BUFFER, 3*sizeof(spicyVertex), simple_triangle, GL_STATIC_DRAW);


    // Index setup
    GLushort *indices = new GLushort[3];
    indices[0]=0;
    indices[1]=1;
    indices[2]=2;
    glGenBuffers(1, &index_buffer[0]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*sizeof(GLushort), indices, GL_STATIC_DRAW);

    // By this point all of our data should be on the graphics device.


    // VAO setup.
    glGenVertexArrays(1, &vao[0]);
    glBindVertexArray(vao[0]);

    // Bind the vertex buffer and setup pointers for the VAO.
    glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex[0]);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(0));
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(spicyVertex), BUFFER_OFFSET(sizeof(spicyVertex)*3));
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
    glDisableVertexAttribArray(3);

    // Bind the index buffeer for the VAO.
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer[0]);

    // Cleanup.
    delete [] simple_triangle;
    delete [] indices;
    glBindVertexArray(0);
    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
}

void Draw_indexed_Vao(){
    glBindVertexArray(vao[0]);      // select first VAO
    glDrawRangeElements(GL_TRIANGLES,0, 3, 3, GL_UNSIGNED_SHORT, NULL);
    glBindVertexArray(0);
}

static void display(void){
    glUseProgramObjectARB( programObj );

    Draw_indexed_Vao();
}

Я не выполняю никаких преобразований вида, когда я использую более простые средства рисования, все хорошо выглядит прямо перед камерой. Я действительно думаю, что это то, как я объявляю эти буферы.

РЕДАКТИРОВАТЬ 1: Приложение с двойной буферизацией.

РЕДАКТИРОВАТЬ 2: РЕШЕНО. Все 3 вершины V0, V1 и V2 модифицировали один и тот же элемент массива. Например, я не использовал simple_triangle[0], simple_triangle[1], simple_triangle[2], но работал только с simple_triangle[0]. Еще раз спасибо за то, что поймали мою глупую ошибку.

Ответы [ 3 ]

1 голос
/ 11 февраля 2012

Добавление фактического ответа.

V1 и V2 модифицируют simple_triangle[0], поэтому существует только одна вершина.

0 голосов
/ 11 августа 2013

Вы можете захотеть изменить

'gl Vertex AttribPointer (1, 3, GL_FLOAT, GL_FALSE, sizeof (spicyVertex), BUFFER_OFFSET (sizeof (spicyVertex) * 3));'

до

'gl Цвет AttribPointer (1, 3, GL_FLOAT, GL_FALSE, sizeof (spicyVertex), BUFFER_OFFSET (sizeof (spicyVertex) * 3));'

Но я не уверен на 100%.

0 голосов
/ 11 февраля 2012

Возможно, вам придется позвонить glFlush(), чтобы перенести содержимое буферов, на которые вы нарисовали, на экран. Кроме того, в зависимости от того, используете ли вы двойную буферизацию, требуемый вызов может быть glutSwapBuffers() (если вы используете GLUT) или какой-либо другой вызов подкачки.

...