Как сделать резинку в OpenGl
Я пытаюсь найти способ резинкой в OpenGL и Visual Studio C++. Проблема, с которой я сталкиваюсь, состоит в том, что некоторые компьютеры с Win 7 (т.е. мой босс) не позволяют мне читать или рисовать в передний буфер, тем самым убивая рисование прямо на него.
glDrawBuffer( GL_FRONT );
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp( GL_XOR );
glPolygonMode(GL_FRONT, GL_LINE);
glRecti(X0, Y0, X1, Y1);
X1 = X;
Y1 = Y;
glRecti(X0, Y0, X1, Y1);
*//Doesn't draw lines*
или копирование переднего буфера в задний буфер (его перерисовка заняла бы много времени), вызывая чертеж swapbuffers, а затем переставляя agian
glReadBuffer( GL_FRONT );
glDrawBuffer( GL_BACK );
glCopyPixels(0, 0, Width, Height, GL_COLOR);
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp( GL_XOR );
glPolygonMode(GL_BACK, GL_LINE);
SwapBuffers(hdc);
glRecti(X0, Y0, X1, Y1);
X1 = X;
Y1 = Y;
glRecti(X0, Y0, X1, Y1);
SwapBuffers(hdc);
*//Doesn't display original drawing*
есть идеи?
1 ответ
Я бы сделал это так:
- нарисовать сцену в закадровый буфер (обратный буфер или другой)
- используйте glReadPixels для чтения изображения в основную память
- сделать текстуру из изображения в основной памяти
После этого, чтобы нарисовать изображение на экране, вы можете просто нарисовать один квад, покрывающий всю область рендеринга, текстурированную с помощью созданной текстуры. Таким образом, нет необходимости повторно визуализировать фактическую сцену при выводе изображения на экран.
Современные реализации OpenGL также могут отображать текстуру без необходимости перемещать изображение в основную память и обратно. Опять же, если рендеринг сцены уже медленный, разница в производительности здесь не будет заметна.