【问题标题】:Blank screen while using glGenBuffers in openGL在openGL中使用glGenBuffers时出现空白屏幕
【发布时间】:2015-04-09 09:12:40
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GL/glut.h>

void changeSize(int w, int h)
{
    if(h == 0) 
        h = 1;
    float ratio = w / h;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, w, h);
    gluPerspective(40,ratio,1.5,20);
    glMatrixMode(GL_MODELVIEW);
}

void renderScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT );
    glLoadIdentity();
    glTranslatef(0.0,0.0,-5.0);
    glDrawArrays(GL_TRIANGLES,0,3);
    glutSwapBuffers();
}

void init()
{
    GLfloat verts[] = {
        0.0,   1.0,
       -1.0,  -1.0,
        1.0,  -1.0
    };

    GLuint bufferid;
    glGenBuffers(1,&bufferid);
    glBindBuffer(GL_ARRAY_BUFFER,bufferid);
    glBufferData(GL_ARRAY_BUFFER,sizeof(verts),verts,GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);

    if(glGetError()==GL_NO_ERROR)
        printf("no error");
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(500,500);
    glutCreateWindow("MM 2004-05");
    glewInit();

    init();

    glutDisplayFunc(renderScene);
    glutReshapeFunc(changeSize);

    if (GLEW_ARB_vertex_program && GLEW_ARB_fragment_program)
        printf("Ready for GLSL\n");
    else {
        printf("No GLSL support\n");
        //exit(1);
    }

    glutMainLoop();
    return 0;
}

使用 glGenBuffers 时,我的屏幕变黑并且没有显示错误。如果我在不使用缓冲区的情况下绘制其他形状,它们会显示但不使用缓冲区对象。

openGL 版本:3.0 操作系统:ubuntu IDE:日食

【问题讨论】:

  • 你的着色器在哪里?
  • 没有着色器,它是使用缓冲区绘制三角形的基本程序
  • 这就是你的问题

标签: c opengl graphics 3d opengl-es-2.0


【解决方案1】:

当使用glGenBuffers 时,您使用的是 OpenGL-3.0 规范。要在 OpenGL-3.0+ 中绘制任何内容,您需要使用着色器,因此屏幕是黑色的;你的三角形没有被着色。

【讨论】:

  • glGenBuffers() 是在 OpenGL 1.5 中引入的。
【解决方案2】:

您在此处使用对通用顶点属性的调用:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);

通用顶点属性只能与着色器结合使用。只要你使用的是固定函数管道,你也必须使用固定函数顶点属性。

使用固定函数属性对应的调用有:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多