视口内的 OpenGL 视口
Posted
技术标签:
【中文标题】视口内的 OpenGL 视口【英文标题】:OpenGL Viewport inside of a Viewport 【发布时间】:2015-01-06 10:56:26 【问题描述】:我正在 opengl 中创建一个迷宫,并且我正在尝试创建一个小地图。为此,我想在视口内创建一个视口。我有三种方法,一种用于创建墙壁,另一种用于创建地板,另一种用于创建小地图。墙壁和地板进入主视口,小地图进入第二个视口。我正在使用显示列表来创建墙壁和地板。我可以创建两个视口,但我的问题是我不知道在哪里调用该方法来创建小地图。
我不知道它是否会有所帮助,但这是我的显示列表方法:
void createDisplayLists(int janelaID)
//Creates the walls
modelo.labirinto[janelaID] = glGenLists(2);
glNewList(modelo.labirinto[janelaID], GL_COMPILE);
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_CURRENT_BIT | GL_ENABLE_BIT);
desenhaLabirinto();
glPopAttrib();
glEndList();
//Creates the floor
modelo.chao[janelaID] = modelo.labirinto[janelaID] + 1;
glNewList(modelo.chao[janelaID], GL_COMPILE);
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_CURRENT_BIT | GL_ENABLE_BIT);
desenhaChao(CHAO_DIMENSAO, modelo.texID[janelaID][ID_TEXTURA_CHAO]);
glPopAttrib();
glEndList();
【问题讨论】:
渲染时需要在地图区域和整个屏幕之间来回切换 我是opengl的新手:/有没有可能解释得更好? 【参考方案1】:OpenGL 不是场景图,它是基于状态的绘图 API。在您进行调用的那一刻,事情就变成了像素(实际上;实际上,事情会被批处理并异步执行,但这对于这种情况无关紧要)。
所以它的要点是:
draw_stuff_into_viewport_A():
glViewport(viewport_A)
setup_projection(project_A)
draw_A_stuff()
draw_stuff_into_viewport_B():
glViewport(viewport_B)
setup_projection(project_B)
draw_B_stuff()
display():
glClear(...)
draw_stuff_into_viewport_A()
draw_stuff_into_viewport_B()
swapBuffers()
【讨论】:
我改变了我的问题,因为我设法创建了两个视口,但我仍然无法在视口内使用视口 @AdamSilva:不要将其视为“视口 inside 视口”。它首先绘制到一个视口,然后绘制到另一个视口,过度绘制位于其下方的任何内容。您可能必须将它与剪刀测试(glEnable(GL_SCISSOR_TEST);
并使用与视口相同的参数调用glScissor
)结合起来,以便首先清除小地图视口的区域。但本质上,您正在过度绘制现有图片的一部分。以上是关于视口内的 OpenGL 视口的主要内容,如果未能解决你的问题,请参考以下文章