Нет отображения (прозрачное окно) с 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
также служит признаком того, что рисунок был, ну, наконец, закончен.
Обратите внимание, что в эти дни мало пользы для одиночного буферизованного рисования. Единственным аргументом против двойной буферизации была нехватка доступной графической памяти. В тех случаях, когда графические процессоры имеют несколько сотен мегабайт оперативной памяти, это уже не является серьезным аргументом.