Нет отображения (прозрачное окно) с OpenGL 2 и Primusrun на одном буфере

Я пытаюсь создать минималистичную программу OpenGL, которая будет работать как на моем чипсете Intel (Mesa), так и на карте NVIDIA через Bumblebee (Optimus).

Мой исходный код (используя FreeGLUT):

#include <GL/freeglut.h>

void display(void);
void resized(int w, int h);

int main(int argc, char** argv)
{
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
        glutInitContextVersion(2, 1);
        glutInitContextProfile(GLUT_CORE_PROFILE);
        glutInitWindowSize(640, 480);
        glutCreateWindow("Hello, triangle!");

        glutReshapeFunc(resized);
        glutDisplayFunc(display);

        glClearColor(0.3, 0.3, 0.3, 1.0);

        glutMainLoop();
        return 0;
}

void display(void)
{
        glClear(GL_COLOR_BUFFER_BIT);

        glColor3f(1.0, 1.0, 1.0);
        glBegin(GL_TRIANGLES);
                glVertex3f(0, 0.75, 0.0);
                glVertex3f(-0.75, -0.75, 0.0);
                glVertex3f(0.75, -0.75, 0.0);
        glEnd();

        glFlush();
}

void resized(int w, int h)
{
        glViewport(0, 0, w, h);
        glutPostRedisplay();
}

Когда я запускаю непосредственно программу (./a.out) на чипсете Intel все работает. У меня нет такого шанса с primusrun ./a.out который отображает прозрачное окно:

https://i.imgur.com/PEUNJOg.png?1

Это не совсем прозрачно, изображение остается, даже если я перемещаю окно.

Что интересно, это когда я меняю на двойной цветовой буфер (используя GLUT_DOUBLE вместо GLUT_SINGLE, а также glutSwapBuffers() вместо glFush()) это работает как на Intel, так и primusrun,

Вот мой glxinfo: http://pastebin.com/9DADif6X
и мой primusrun glxinfo: http://pastebin.com/YCHJuWAA

Я делаю это неправильно или это ошибка, связанная с Bumblebee?

1 ответ

Решение

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

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

В дополнение к этому, чтобы закончить один буферизованный рисунок, который вы называете glFinish не glFlush; glFinish также служит признаком того, что рисунок был, ну, наконец, закончен.

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

Другие вопросы по тегам