OpenGL程序不显示任何图片

Posted

技术标签:

【中文标题】OpenGL程序不显示任何图片【英文标题】:OpenGL program doesn't show any picture 【发布时间】:2017-04-30 13:22:08 【问题描述】:

我尝试显示一个简单的三角形,但屏幕上什么也没有。

我可以清除颜色,但没有别的。 (我把所有东西都放在一个大文件里)。 我正在使用 SDL 创建窗口。其他一切都应该只是 OpenGL。

这是我的代码:

int main()
    // Init window
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

    SDL_Window* window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL);
    SDL_GLContext context = SDL_GL_CreateContext(m_window);

    GLenum status = glewInit();

    if(status != GLEW_OK)
        std::cerr << "Glew failed!" << std::endl;
    

    isClosed = false;

    // Init everything else

    GLuint vaoID;
    glGenVertexArrays(1, &vaoID);
    glBindVertexArray(vaoID);
    GLuint vboID;
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    GLfloat vert2[] = -1,-1,0, 1,-1,0, 0,0,0;
    glBufferData(GL_ARRAY_BUFFER, sizeof(vert2), vert2, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);
    glDisableVertexAttribArray(0);
    glBindVertexArray(0);

    GLuint frag = glCreateShader(GL_FRAGMENT_SHADER);
    GLuint vert = glCreateShader(GL_VERTEX_SHADER);
    std::string sFrag = "#version 130 \n out vec4 out_color; \n void main(void)out_color = vec4(1, 0, 1, 1);";
    std::string sVert = "#version 130 \n in vec3 pos; \n void main(void)gl_Position = vec4(pos, 1);";
    char const* cFrag = sFrag.c_str();
    char const* cVert = sVert.c_str();

    GLint success = 0;
    glShaderSource(frag, 1, &cFrag, NULL);
    glCompileShader(frag);
    glGetShaderiv(frag, GL_COMPILE_STATUS, &success);

    if(success == GL_FALSE) std::cerr << "Möb" << std::endl;
       else std::cout << "YES" << std::endl;

    glShaderSource(vert, 1, &cVert, NULL);
    glCompileShader(vert);
    glGetShaderiv(vert, GL_COMPILE_STATUS, &success);

    if(success == GL_FALSE) std::cerr << "Möb" << std::endl;
        else std::cout << "YES" << std::endl;

    GLuint program = glCreateProgram();
    glAttachShader(program, vert);
    glAttachShader(program, frag);
    glBindAttribLocation(program, 0, "pos");
    glDeleteShader(vert);
    glDeleteShader(frag);
    glLinkProgram(program);
    //glValidateProgram(program);

    while(!isClosed)
        glUseProgram(program);
        glBindVertexArray(vaoID);
        glEnableVertexAttribArray(0);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glDisableVertexAttribArray(0);
        glBindVertexArray(0);
        glUseProgram(0);



        // Update

        SDL_GL_SwapWindow(window);

        SDL_Event e;

        while(SDL_PollEvent(&e))
             if(e.type == SDL_QUIT)
                  isClosed = true;
             
       

       glClearColor(0, 1, 0, 1);
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    return 0;

【问题讨论】:

您的代码存在一些问题,但它们都不需要解释问题。 1:您没有指定 GL 版本和配置文件,但您使用的是 #version 330 core 着色器。根据您使用的 GL 实现,这将或不会起作用。 2. 您尝试绘制 4 个顶点,但缓冲区中只有 3 个。 3. 你从不检查你的程序的链接状态。 4. 你根本不检查任何 GL 错误。 @derhass:不要忘记一个完全缺席的glewInit() 电话。 我只是忘记复制了 【参考方案1】:

您在display.update() 之前调用glClear(),这似乎表明您在交换它之前清除后台缓冲区。假设其他代码是正确的,如果你交换glClear()display.update() 的位置,你可能会看到一些东西。

【讨论】:

谢谢,这对我来说很有意义。但是我换了之后,结果还是一样。 可能值得用您使用什么库来创建 GL 上下文以及您是否将代码基于示例来更新问题。 (某些库要求您显式设置扩展。)接下来我要检查的是它是否正在创建深度缓冲区。如果是这种情况,您应该将 glClear() 更改为 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 我认为,我已经正确设置了有关 SDL 的所有内容,并且如您所见,我添加了 GL_DEPTH_BUFFER_BIT。但我仍然得到相同的结果。

以上是关于OpenGL程序不显示任何图片的主要内容,如果未能解决你的问题,请参考以下文章

我要用opengl 显示一张图片,现在已经可以显示出来; 我现在需要把它旋转90,不知道怎么旋转。help~~

OpenGL啥都不显示?

C OpenGL glfw3三角形不显示

自定义 OpenGL 缓冲区类不显示任何内容

OpenGL - 纹理显示不正确(夹紧?)

OpenGL程序没有显示三角形