2012-03-16 20 views
0

私は少しのOpenGLをやり始めましたが、固定機能パイプラインの代替手段を発見したので、チュートリアルを検索しました。残念ながら、最も良いチュートリアルではC++を使用しています。可能であればCに固執したいと思います。だから私はものをコピーして貼り付けて試すことができませんでした。OpenGLドローバッファの問題

コードをコピーアンドペーストするとエラーが発生しましたが、どのように対処すべきかわかりません。問題のエラーは、「セグメンテーション違反」だった、とここのコードです:もちろん

#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は正常に実行されます(論理的に描画することなく)。

助けが必要ですか?

答えて

4

バッファリングを開始する前にglを初期化する必要があります。初期化プロセスは、これらの関数へのポインタを取り出して割り当てます。それ以外の場合はnullです。

+0

glfwInitはOpenGLを初期化しませんか?私はそれを前に置いてみました。この短いコードでは、続いてコンピュータがクラッシュし、フルコードではまだセグメンテーション違反で終了しました。 – Orpheon

+0

まあ、明らかにglfwInitは、他のものよりも先に行う必要があるので、ここで与えたコードサンプルでは少なくとも間違っています。 DrawArraysを削除すると、それ以前に呼び出された他のいくつかの関数があるとエラーが修正されるというのは不思議です。 – Robinson

+0

@Orpheon:いいえ、 'glfwInit'はOpenGLを初期化しません。 GLFWを初期化します。 OpenGLを使用する前に、GLFW *を初期化してウィンドウを開く必要があります。 –