OpenGL: как наложить в одном и том же окне GL два окна, нарисованные в другом окне просмотра и glortho - PullRequest
0 голосов
/ 01 марта 2011

в функции Draw () GLForm (openGL с Borland Builder) я сначала рисую изображение с помощью SDK-функции capture_card :: paintGL ().И эта функция заставляет иметь эту проекцию перед вызовом:

glViewport(0, 0, (GLsizei)newSize.width, (GLsizei)newSize.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);

И на переднем плане этого нарисованного изображения я должен нарисовать другой слой, который уже был закодирован для другого видового экрана и другой проекции glortho:

(в MainResizeGL (), вызываемом для событий "onResize"):

glViewport(-width, -height, width * 2, height * 2);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(double(-width)*viewport_ratio, double(width)*viewport_ratio, double(-height), double(height), 1000.0, 100000.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

(и в MainDraw (), вызываемом "Ontimer"):

glLoadIdentity();
glTranslatef(0.0, 0.0, -50000.0);
mpGLDrawScene->DrawScene(); //(this calls a doDrawScene() I don't understand exactly how it draws : with calling this->parent, etc.)
glFlush();
SwapBuffers(ghDC);

Таким образом, я преобразовал MainDraw () в следующее:

// viewport and projection needed for the paintGL
glViewport(0, 0, (GLsizei)newSize.width, (GLsizei)newSize.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);

// call of the paintGL
if(capture_button_clicked) capture_card::paintGL();

// content of the ResizeGL in order to get back to the projection desired and to matrixmode modelview
glViewport(-width, -height, width * 2, height * 2);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(double(-width)*viewport_ratio, double(width)*viewport_ratio, double(-height), double(height), 1000.0, 100000.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// original drawscene call
glLoadIdentity();
glTranslatef(0.0, 0.0, -50000.0);
mpGLDrawScene->DrawScene(); //(this calls a doDrawScene() I don't understand exactly how it draws : with calling this->parent, etc.)
glFlush();
SwapBuffers(ghDC);

В результате я вижу элементы «drawscene» древнего проекта, но когда я нажимаю на «capture_button», paintGL остается невидимым, инарисованные элементы превращаются в нечто вроде канвы альфа-канала.

Я попытался добавить glScalef (width, height, 1) после paintGL, изменил glTranslatef (0,0,50000), в результате чего я увиделнебольшое количество пикселей с цветами paintGL, но элементы наложения затем исчезают.

Как я могу заставить эти два разных видовых экрана наложить друг на друга (т. е. drawscene above the paintGL)?

Заранее спасибо, ура, Арно.

1 Ответ

0 голосов
/ 02 марта 2011

Используйте тест ножниц вместе с окном просмотра

glEnable(GL_SCISSOR_TEST);
glScissor(viewport.x, viewport.y, viewport.width, viewport.height)
glViewport(viewport.x, viewport.y, viewport.width, viewport.height)

и очистите буфер глубины (только буфер глубины) между различными этапами рендеринга.

...