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);
}
有誰可以幫我嗎?
檢查glDrawArrays上的手冊。它需要* count *作爲第三個參數。 –
我更新了我的問題。我現在想繪製一個簡單的三角形。所以我在我的glDrawArrays中繪製了3個頂點,所以我把第三個參數的值設置爲第三個參數(36爲一個立方體),但它總是一樣的。我有一個分段錯誤。但是,我的頂點數組分配似乎是正確的(3 * sizeof(Vertex))。所以我不明白,發生了什麼事。 – user1364743
@ mr5不,這當然是錯誤的,因爲他使用了維也納國際組織。 –