LINUX.ORG.RU

Проблемы с отрисовкой OpenGL

 ,


0

1

Имеется ManjaroLinux с установленным Mate. При разработке под OpenGL возникает такая проблема, что OpenGL не обновляет кадр, но, если изменить размер окна, то OpenGL сразу рисует новый кадр. Проблема возникает постоянно, не важно через что создаю окно(пробовал Qt5, glfw и FreeGlut), всё равно одна и та же проблема.

FreeGlut

glutSwapBuffers() ты случайно вызываешь не в секции кода где эвенты получаешь? Делай swap в самом конце игрового цикла

Остальное я не использовал, но кажется это чисто твой косяк. То есть ты обрабатываешь в коде изменение окна, и если оно произошло делаешь swap почему то там.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от deadplace

Да просто glxgears запустить и всё. Если крутится то занчит косяк в коде. Я на 99% уверен что отрисовка экрана вызывается из обработки событий

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Во-первых, я умею пользоваться OpenGL в core режиме, во-вторых почему же тогда отрисовка зависает во всех 3-х попытках: в попытке с Qt, в попытке c GLFW и в попытке с FreeGLUT?

ogurka8772
() автор топика
Ответ на: комментарий от ogurka8772

Ну, хорошо, допустим с кодом проблем нет. Ты запускал сторонние gl приложения? glxgears хотя бы? Если везде то будет и там.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

И в функции вывода прописал тестовое сообщение в консоль, но оно выводит сообщение только в случае изменения размера окна

ogurka8772
() автор топика

Я думаю ошибка в коде. На какой версии опенжл-я пишешь? Минимальный пример нерабочего кода кинь.

anonymous
()
Ответ на: комментарий от ogurka8772

Ну блоб вестимо. Тогда в шапку добавляй glxinfo выхлоп на настебин, видеокарта какая, драйвер, версии. И простейший кусок кода да хоть на том же FreeGlut что бы отсечь вопросы. А то тут только ванговать можно. И жди. Я ответа не знаю, всё это странно. Не должно быть такого.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Вывод glxinfo

[sovier@sovier Debug]$ glxinfo | grep OpenGL OpenGL vendor string: NVIDIA Corporation OpenGL renderer string: GeForce GT 440/PCIe/SSE2 OpenGL core profile version string: 4.6.0 NVIDIA 390.132 OpenGL core profile shading language version string: 4.60 NVIDIA OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 4.6.0 NVIDIA 390.132 OpenGL shading language version string: 4.60 NVIDIA OpenGL context flags: (none) OpenGL profile mask: (none) OpenGL extensions: OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 390.132 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20

Код отрисовки

void display() {
    std::cout << "test\n";
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    GLuint VBO;
    glGenBuffers(1, &VBO);

    glBindVertexArray(screenVAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(screenVertices), screenVertices, GL_DYNAMIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);

    glUseProgram(screenShaderProgram);
    glDrawArrays(GL_QUADS, 0, 4);
    glBindVertexArray(0);

    glutSwapBuffers();
}

ogurka8772
() автор топика
Ответ на: комментарий от ogurka8772

А теперь вот так

 glutPostRedisplay();
 glutSwapBuffers();

когда ты внизу потом вызываешь glutMainLoop(); он не имея событий и заданий всё останавливает. Вот тебя и фризило.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Спасибо, помогло. Но остаётся вопрос, почему это происходит и как от этого избавиться в других случаях (QT, SFML, GLFW)

ogurka8772
() автор топика
Ответ на: комментарий от peregrine

Так то GLFW и FreeGLUT занимаются созданием окон и контекста, а не отрисовкой, и делают это по разному у каждого свой цикл обработки событий

ogurka8772
() автор топика
Ответ на: комментарий от peregrine

Да поифг в принципе. Ваще лучше SDL2 взять и делать всё явно что бы без менеджеров этих всех, когда надо вызвал swap() и получил картинку.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Оно лучше, но для быстроты проверки нужного мне алгоритмы, я выбрал то, что быстрее создаст окно без лишней мороки.

ogurka8772
() автор топика
Ответ на: комментарий от peregrine

Не должно glootMain внутря себя while(true) запускает и дёргает каллкеки которые мы ему задали ранее, для всего остального стоп

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от ogurka8772

Оно лучше, но для быстроты проверки

Это микрофреймворки и у них свои камни. Читай документацию по ньюансам каждого =) Вот чесное слово легче и прощще взять SDL2 там мороки ровно ноль. Зато всё явно и прозрачно.

#include <GL/gl.h>
#include <SDL2/SDL.h>

int main(int argc, char **argv)
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window *window = SDL_CreateWindow(
        "SDL + OpenGL Tutorial",
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED, 
        1366,
        768,
        SDL_WINDOW_OPENGL);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
                        SDL_GL_CONTEXT_PROFILE_CORE);

    SDL_GLContext mainContext = SDL_GL_CreateContext(window);


    SDL_Event event;
    int running = 1;

    while (running)
    {
        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
            {
                running = 0;
            }
        }

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

        SDL_GL_SwapWindow(window);
    }



    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

make

all:
	$(CC) gl.c -o gl -lSDL2 -lGL
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от ogurka8772

Ну вот. События окна кто обрабатывать будет? Пока сам не спросишь, он не поймёт что перерисовывать надо.

peregrine ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Не должно. Просто лучше подстраховаться, я видел, как такую функцию ещё в одном цикле дергали когда смотрел лабы в универе.

peregrine ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.