Проблемы с буфером отрисовки OpenGL

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

Однако копирование и слияние кода приводили к ошибкам, и я не уверен, как мне с ними справиться. Рассматриваемая ошибка была «Ошибка сегментации», и вот код:

#include <GL/glfw.h>
#include <GL/glu.h>
#include <stdlib.h>

#define SCREEN_WIDTH 1600
#define SCREEN_HEIGHT 1000

void main(int argc, char **argv)
{
    float mouse_x, mouse_y;

    GLuint positionBufferObject;
    const float vertexPositions[] = {
    0.75f, 0.75f, 0.0f, 1.0f,
    0.75f, -0.75f, 0.0f, 1.0f,
    -0.75f, -0.75f, 0.0f, 1.0f,
};
    glGenBuffers(1, &positionBufferObject);

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    int running = GL_TRUE;
    // Initialize GLFW
    if( !glfwInit() )
    {
        exit( EXIT_FAILURE );
    }

    // Open an OpenGL window
    if( !glfwOpenWindow(SCREEN_WIDTH,SCREEN_HEIGHT, 8,8,8,8,8,8, GLFW_WINDOW ) )
    {
        glfwTerminate();
        exit( EXIT_FAILURE );
    }

    while (running)
    {
        glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

        glDrawArrays(GL_TRIANGLES, 0, 3);
    }
}

Конечно, здесь не хватает много кода, потому что он (видимо) не повлиял на ошибку. Комментирование «glDrawArrays» устраняет ошибку, и OpenGL работает нормально (логически ничего не рисуя).

Любая помощь?


person Orpheon    schedule 16.03.2012    source источник


Ответы (1)


Вы должны инициализировать gl до того, как начнете привязывать буферы и так далее. Процесс инициализации извлекает и присваивает указатели на эти функции. В противном случае они равны нулю.

person Robinson    schedule 16.03.2012
comment
Разве glfwInit не инициализирует OpenGL? Я пытался поставить это раньше. На этом коротком коде впоследствии произошел сбой моего компьютера, а на полном коде все равно закончилась ошибка сегментации. - person Orpheon; 16.03.2012
comment
Ну, очевидно, glfwInit - это то, что вам нужно сделать в первую очередь, прежде чем что-то еще, так что, по крайней мере, это неправильно в приведенном вами примере кода. Странно, что вы говорите, что удаление DrawArrays исправляет ошибку, хотя до этого вызывалось довольно много других функций, которые не должны работать! - person Robinson; 16.03.2012
comment
@Orpheon: Нет, glfwInit не инициализирует OpenGL. Он инициализирует GLFW. Прежде чем вы сможете использовать OpenGL, вы должны инициализировать GLFW и открыть окно. - person Nicol Bolas; 16.03.2012
comment
Возможно. Я не уверен, что такое glfwinit. Я знаю, что вам нужно инициализировать GL, прежде чем пытаться дать ему команды, однако: p. - person Robinson; 17.03.2012