带有凹凸的OpenGL绘图点

时间:2015-09-13 22:20:53

标签: opengl glut

我试图在0,0画一个点,但我的屏幕变白并停止响应。

有人可以查看代码并查看我在哪里犯了错误吗?

float *vertices;
GLubyte *pindices;
int width, height;

GLuint vboHandlePoints[1];
GLuint indexVBOPoints;

int numberOfPoints;
GLuint buf;

void initVboPoints(){

    GLenum err = glewInit();

    if (err != GLEW_OK)
    {
        fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
    }

    glGenBuffers(1, &vboHandlePoints[0]);   // create a VBO handle
    glBindBuffer(GL_ARRAY_BUFFER, vboHandlePoints[0]);   // bind the handle to the current VBO 
    glBufferData(GL_ARRAY_BUFFER, 1 * 2 * 4, vertices, GL_STATIC_DRAW); // allocate space and copy the data over
    glBindBuffer(GL_ARRAY_BUFFER, 0);   // clean up 

    glGenBuffers(1, &indexVBOPoints);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOPoints);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte)*1 * 2, pindices, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);  //clean up 


}
void display(){
    glClearColor(0, 1, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor4f(0, 0, 0, 1);

    glPointSize(5);
    glEnableClientState(GL_VERTEX_ARRAY);


    glBindBuffer(GL_ARRAY_BUFFER, vboHandlePoints[0]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOPoints);
    glVertexPointer(2, GL_FLOAT, 0, 0);// 2-dimension

    glDrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, (char*)NULL + 0);
}

void initializeGlut(int argc, char** argv){

    glutInit(&argc, argv);
    width = 400;
    height = 400;
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowSize(width, height);
    glutCreateWindow("Bhavya's Program");
    glutDisplayFunc(display);

}

void initNormal(){
    vertices = new float[2];
    pindices = new GLubyte[1];
    vertices[0] = 0;
    vertices[1] = 0;
    pindices[0] = 0;
}

int main(int argc, char** argv){

    initNormal();
    initializeGlut(argc, argv);
    initVboPoints();

    glutMainLoop();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

GL_ARRAY_BUFFER来电时,您没有glVertexPointer个约束。所有gl*Pointer函数都引用当前绑定GL_ARRAY_BUFFER,缓冲区名称成为指针的一部分。这样,您可以从不同的VBO中获取每个属性。 GL_ARRAY_BUFFER绑定与glDraw*函数族完全无关。

由于您使用已弃用的旧版GL,因此绑定VBO 0仍然有效,并且您的指针引用客户端内存。所以你的应用程序可能会崩溃,因为你告诉GL read the data at memory address 0 ...

答案 1 :(得分:0)

问题是glFlush();是必需的