Дисплей мигает с OpenGL в Ubuntu

В настоящее время я разрабатываю простое приложение OpenGl с C++, используя генератор GLFW3 и GLAD. Когда я запускаю программу, весь мой дисплей мигает черным цветом. Как я могу это исправить?

#include "include/glad.h"
#include <GLFW/glfw3.h>

#include <iostream>


void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main()
{
    // glfw: initialize and configure
    // ------------------------------
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT,           "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
    std::cout << "Failed to create GLFW window" << std::endl;
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

// glad: load all OpenGL function pointers
// ---------------------------------------
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
}

// render loop
// -----------
while (!glfwWindowShouldClose(window))
{
    // input
    // -----
    processInput(window);

    // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
    // -------------------------------------------------------------------------------
    glfwSwapBuffers(window);
    glfwPollEvents();
}

// glfw: terminate, clearing all previously allocated GLFW resources.
// ------------------------------------------------------------------
glfwTerminate();
return 0;
}

// process all input: query GLFW whether relevant keys are     pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{
    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    // make sure the viewport matches the new window dimensions; note that width and
    // height will be significantly larger than specified on retina displays.
    glViewport(0, 0, width, height);
}

Вот мой glxinfo | grep OpenGl

OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Sandybridge Mobile 
OpenGL core profile version string: 3.3 (Core Profile) Mesa 17.0.7
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 17.0.7
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 17.0.7
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
OpenGL ES profile extensions:

Я предполагаю, что проблема связана с тем, что настройки OpenGL влияют не только на мой проект, но и на всю систему. Поэтому мне интересно, это проблема в моем коде или проблема с моим оборудованием, и только обновление системы может решить это ужасное мигание.


person Reodont    schedule 31.12.2017    source источник
comment
Вы ничего не рисуете, поэтому вы увидите все, что хранится в (неинициализированном) заднем буфере.   -  person BDL    schedule 31.12.2017


Ответы (1)


В вашем коде отсутствуют команды рисования. Вы должны добавить команды рисования в свой цикл рендеринга после обработки ввода, но перед заменой буферов.

например, чтобы заполнить фон синим цветом

    ...
    while (!glfwWindowShouldClose(window))
    {
        processInput(window);

        glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    ...
person Onur A.    schedule 31.12.2017
comment
Вау, сейчас работает. Но мне все равно интересно, почему он мигал? - person Reodont; 31.12.2017
comment
glfwSwapBuffers() меняет местами передний и задний буфер. Первый предназначен для отображения на экране, второй — для рендеринга (командами OpenGL). Если вы очищаете только один раз, один буфер заполняется прозрачным цветом, а другой находится в исходном состоянии (в данном случае заполнен нулями, что делает его черным). Из-за повторяющегося glfwSwapBuffers() они становятся видимыми попеременно, (и в ответе написано, как это исправить). - person Scheff's Cat; 31.12.2017
comment
На самом деле современная реализация GL может использовать более двух буферов в любом порядке, а также может перераспределять новые в любое время. Со стороны GL содержимое заднего буфера явно не определено после операции подкачки буфера, поэтому все может появиться, когда вы подкачиваете без рисования (получая ноль или части предыдущего фреймы встречаются чаще всего). - person derhass; 31.12.2017
comment
согласен с @derhass. Если вы не очистите буфер, он будет рисовать то, что есть в его текущем буфере, что, скорее всего, приведет к искаженному/поврежденному виду. - person Onur A.; 31.12.2017