2013-05-27 79 views
0

我的程序的目標是使用VBO在旋轉中顯示一個簡單的三角形。 程序在glDrawArrays調用中失敗(分段錯誤)。 這裏是我的一部分C++代碼:glDrawArrays使用VBO失敗

#include <iostream> 
#include <SDL/SDL.h> 
#include <SDL/SDL_image.h> 
#include <gl/glew.h> 

#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 

#define OFFSET_BUFFER(offset) ((char*)NULL + (offset)) 

GLfloat angle = 0.0f; 

const static int WIDTH = 500; 
const static int HEIGHT = 500; 

struct Vertex 
{ 
    float x, y, z; 
    float nx, ny, nz; 
    float s0, t0; 
}; 

Vertex vertices[3] = 
{ 
    1.000000f, -1.000000f, -1.000000f, 
    0.000000f, -1.000000f, 0.000000f, 
    0.626059f, 0.734295f, 

    1.000000f, -1.000000f, 1.000000f, 
    0.000000f, -1.000000f, 0.000000f, 
    0.626059f, 0.512602f, 

    -1.000000f, -1.000000f, 1.000000f, 
    0.000000f, -1.000000f, 0.000000f, 
    0.404365f, 0.512602f, 
}; 

[...] 

static GLuint  applyVBO(void) 
{ 
    GLuint   vboID; 

    glGenBuffers(1, &vboID); 
    glBindBuffer(GL_VERTEX_ARRAY, vboID); 
    glBufferData(GL_VERTEX_ARRAY, 3 * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW); 
    glBindBuffer(GL_VERTEX_ARRAY, NULL); 
    return (vboID); 
} 

int     main(int ac, char **av) 
{ 
    bool   continuer = true; 
    SDL_Event  event; 

    SDL_Init(SDL_INIT_VIDEO); 
    SDL_WM_SetCaption("VBO tests",NULL); 
    SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL); 

    if (glewInit() != GLEW_OK) 
     return (-1); 

    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    //glEnable(GL_NORMALIZE); 

    //Initialize projection 

    glViewport(0, 0, WIDTH, HEIGHT); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45.0, (float)WIDTH/(float)HEIGHT, 1.0f, 100.0f); 
    gluLookAt(0.0f, 0.0f, 8.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); 

    //Initialize VBO 

    GLuint vboID = applyVBO(); 

    //Initialize uv-mapping 

    GLuint texID = applyTexture("Box.bmp"); 

    //Initialize camera 

    //Main loop 

    while (continuer) 
    { 
     eventListener(&event, &continuer); 

     glClearDepth(1.0f); 
     glClearColor(0.13f, 0.12f, 0.13f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glPushMatrix(); 
     glRotatef(angle, 1.0f, 1.0f, 1.0f); 

     glBindBuffer(GL_VERTEX_ARRAY, vboID); 

     glEnableClientState(GL_VERTEX_ARRAY); 
     glVertexPointer(3, GL_FLOAT, sizeof(Vertex), OFFSET_BUFFER(0)); 
     glEnableClientState(GL_NORMAL_ARRAY); 
     glNormalPointer(GL_FLOAT, sizeof(Vertex), OFFSET_BUFFER(12)); 
     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
     glBindTexture(GL_TEXTURE_2D, texID); 
     glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), OFFSET_BUFFER(24)); 

     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glBindTexture(GL_TEXTURE_2D, NULL); 
     glBindBuffer(GL_VERTEX_ARRAY, NULL); 

     glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
     glDisableClientState(GL_NORMAL_ARRAY); 
     glDisableClientState(GL_VERTEX_ARRAY); 

     angle += 0.50f; 
     glPopMatrix(); 

     glFlush(); 
     SDL_GL_SwapBuffers(); 
    } 

    SDL_Quit(); 
    return (0); 
} 

有誰可以幫我嗎?

+1

檢查glDrawArrays上的手冊。它需要* count *作爲第三個參數。 –

+0

我更新了我的問題。我現在想繪製一個簡單的三角形。所以我在我的glDrawArrays中繪製了3個頂點,所以我把第三個參數的值設置爲第三個參數(36爲一個立方體),但它總是一樣的。我有一個分段錯誤。但是,我的頂點數組分配似乎是正確的(3 * sizeof(Vertex))。所以我不明白,發生了什麼事。 – user1364743

+0

@ mr5不,這當然是錯誤的,因爲他使用了維也納國際組織。 –

回答

1

問題來自於GL_VERTEX_ARRAY標誌不是好的標誌。他們必須被GL_ARRAY_BUFFER替換。