OpenGL程序不显示任何图片

时间:2017-04-30 13:22:08

标签: c++ opengl glew

我试图显示一个简单的三角形,但屏幕上没有任何内容。

我可以清除颜色,但没有别的。 (我把所有东西放在一个大文件中)。 我正在使用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 个答案:

答案 0 :(得分:2)

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

相关问题