【问题标题】:OpenGL only blank screen when drawing triangle绘制三角形时OpenGL只有黑屏
【发布时间】:2018-07-08 18:34:33
【问题描述】:

这个程序是用 CodeBlocks 编写的。我已经将选项GLSDL2 添加到build options -> Linker settings 。在CodeBlocks 中构建和运行此程序时,我没有收到任何错误,但只看到了一个空白窗口,而它应该是一个三角形。我也尝试使用命令行g++ main.cpp -o main -lGL -lSDL2 & ./main,但遇到了同样的问题。有什么想法吗?

#define GL3_PROTOTYPES 1
#include <GL3/gl3.h>

#include <SDL2/SDL.h>
#include <iostream>

int main(int argc, char **argv)
{
    // Notre fenêtre
    SDL_Window* fenetre(0);
    SDL_GLContext contexteOpenGL(0);

    SDL_Event evenements;
    bool terminer(false);


    // Initialisation de la SDL
    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        std::cout << "Erreur lors de l'initialisation de la SDL : " << SDL_GetError() << std::endl;
        SDL_Quit();

        return -1;
    }


    // Version d'OpenGL
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);


    // Double Buffer
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);


    // Création de la fenêtre
    fenetre = SDL_CreateWindow("Test SDL 2.0", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);

    if(fenetre == 0)
    {
        std::cout << "Erreur lors de la creation de la fenetre : " << SDL_GetError() << std::endl;
        SDL_Quit();

        return -1;
    }


    // Création du contexte OpenGL
    contexteOpenGL = SDL_GL_CreateContext(fenetre);

    if(contexteOpenGL == 0)
    {
        std::cout << SDL_GetError() << std::endl;
        SDL_DestroyWindow(fenetre);
        SDL_Quit();

        return -1;
    }

    // Vertices et coordonnées
    float vertices[] = {-0.5, -0.5,   0.0, 0.5,   0.5, -0.5};


    // Boucle principale
    while(!terminer)
    {
        // Gestion des évènements

        SDL_WaitEvent(&evenements);

        if(evenements.window.event == SDL_WINDOWEVENT_CLOSE)
            terminer = true;


        // Nettoyage de l'écran
        glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

        // On remplie puis on active le tableau Vertex Attrib 0
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);

        // On affiche le triangle
        glDrawArrays(GL_TRIANGLES, 0, 3);

        // On désactive le tableau Vertex Attrib puisque l'on n'en a plus besoin
        glDisableVertexAttribArray(0);


        // Actualisation de la fenêtre
        SDL_GL_SwapWindow(fenetre);
    }
    // On quitte la SDL

    SDL_GL_DeleteContext(contexteOpenGL);
    SDL_DestroyWindow(fenetre);
    SDL_Quit();

    return 0;
}

【问题讨论】:

  • 你的着色器在哪里?
  • 我正在努力。在我学习的教程中,Shader 的部分紧随其后。但现在我意识到在我的程序中使用 Shader 以使其正常工作是多么重要

标签: c++ opengl sdl-2


【解决方案1】:

问题可能是,SDL_WaitEvent 一直等到它收到输入,所以它阻塞了你的代码的其余部分:“使用此函数无限期等待下一个可用事件”(来自@987654321 @)。尝试使用类似https://wiki.libsdl.org/SDL_PollEvent

【讨论】:

    【解决方案2】:

    在我的系统上,glGetError() 在从这里调用 glEnableVertexAttribArray(0) 后返回 INVALID_OPERATION:

    // On remplie puis on active le tableau Vertex Attrib 0
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices);
    

    像这样的错误不会导致任何内容被绘制到屏幕上。更多关于 glGetError() 的信息可以在这里找到:

    glGetError()

    另外,您没有在任何地方指定着色器。您可能需要考虑阅读有关如何在 OpenGL 中在屏幕上显示三角形的完整教程。可以在此处找到有关如何执行此操作的综合教程:

    https://learnopengl.com/Getting-started/Hello-Triangle

    【讨论】:

    • 非常感谢!这将非常有帮助!我已经创建了我的着色器,但仍然无法使其工作。一旦我得到正确的答案,我会回复大家。
    猜你喜欢
    • 2020-12-08
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多