Объекты буфера вершин Open GL - PullRequest
0 голосов
/ 24 февраля 2011

Я действительно новичок в Open GL, и я пытаюсь создать не устаревший код.Теперь, что я не могу понять, это VBO.Это все, что я получил до сих пор, не могли бы вы объяснить, что я должен делать.Кроме того, у меня есть руководство по программированию OpenGL, поэтому, если вы можете указать несколько страниц для чтения, это также будет очень полезно.

#include <GL/glew.h>
#include <GL/freeglut.h> 

GLuint ID[2];
GLfloat PositionData[][2] ={{50,50},{100,50},{50,100}, {100,50}, {100, 100}, {50, 100}};
GLfloat Colors[][3] = {{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3},{0.1, 0.2, 0.3}};

void init(){
    glewInit();
    glClearColor(1.0, 1.0, 1.0, 0.0);
}

void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glShadeModel(GL_FLAT);
    glGenBuffers(2, ID);
    glBindBuffer(GL_ARRAY_BUFFER, ID[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(PositionData), PositionData, GL_STATIC_DRAW);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, ID[1]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Colors), Colors, GL_STATIC_DRAW);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    glDrawArrays(GL_TRIANGLES, 0, 12);

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDeleteBuffers(2, ID);
    glFlush();
}

void reshape(int w, int h){
    glViewport(0,0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}

int main(int argc, char *argv[]){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("I don't get VBOs");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011

Я быстро просмотрел ваш код, одна вещь выделялась: вы полностью упускаете суть VBO.При каждом вызове отрисовки вы создаете объекты VBO, загружаете данные, пытаетесь их отрисовать (это не сработает, потому что шейдеры, придающие смысл атрибутам вершин, ошибочно), а затем удаляете их.

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

Но это такмногое другое вкручивается в этот код, например, установка матрицы проекции в обратном вызове.С одной стороны, в ядре OpenGL-3 у вас больше нет этих встроенных матриц.Это все шейдерные формы.И затем вы устанавливаете эти матрицы по требованию в обработчике рендеринга.

Я думаю, что мне действительно следует написать это полное руководство по OpenGL-3, демонстрирующее правильные идиомы.

2 голосов
/ 24 февраля 2011

Вы настраиваете собственные атрибуты вершин с индексами 0 и 1, но я не вижу шейдера, который их использует.Если у вас еще нет шейдера, он не будет работать, потому что конвейер с фиксированной функцией принимает определенные атрибуты (для вашего случая настроены glVertexPointer и glColorPointer).

Если вы решилисделать шейдер (ваша цель - сделать его для ядра GL-3, верно?), не забудьте присвоить вашим атрибутам вершины фактические имена, которые вы используете в коде GLSL, прежде чем связывать его:

glBindAttribLocation( program_id, attribute_id, attribute_variable_name )
...