我正在使用关卡构建器应用来为游戏构建内容。 iPad屏幕的一部分是专用控制面板,其余部分是正在构建的级别的图形表示。我需要在不影响控制面板的情况下放大和缩小水平区域。我正在使用openGL ES进行渲染。谁能在这里给我一些指示?我可以使用不同的视口拆分屏幕,因此只需缩放一个吗?
答案 0 :(得分:2)
诀窍是要了解OpenGL是一个状态机,并且没有“全局初始化”之类的东西。只要您按照编写错误的教程并在窗口调整大小处理程序中设置投影矩阵,您就会陷入困境。你实际做的是这样的:
void render_perspective_scene(void);
void render_ortho_scene(void);
void render_HUD();
void display()
{
float const aspect = (float)win_width/(float)win_height;
glViewport(0,0,win_width,win_height);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-aspect*near/lens, aspect*near/lens, -near/lens, near/lens, near, far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
render_perspective_scene();
glEnable(GL_SCISSOR_TEST);
// just clear the depth buffer, so that everything that's
// drawn next will overlay the previously rendered scene.
glClear(GL_DEPTH_BUFFER_BIT);
glViewport(ortho_x, ortho_y, ortho_width, ortho_height);
glScissor(ortho_x, ortho_y, ortho_width, ortho_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-aspect*scale, aspect*scale, -scale, scale, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
render_ortho_scene();
// Same for the HUD, only that we render
// that one in pixel coordinates.
glViewport(hud_x, hud_y, hud_width, hud_height);
glScissor(hud_x, hud_y, hud_width, hud_height);
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, win_width, 0, win_height, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
render_HUD();
}
重要的是,在渲染该子部分之前,在绘图处理程序中设置视口/剪刀和投影。
答案 1 :(得分:1)
如果您使用OpenGL ES渲染(大概是2.0),那么您可以完全控制渲染内容的缩放。您可以决定应用比例的位置,并决定如何渲染比例。
我猜你的代码目前看起来有点像这样。
Get view scale
Apply view scale to view matrix
Render level
Render control panel
什么时候应该是这样的。
Render control panel
Get view scale
Apply view scale to view matrix
Render level
用于转换关卡的矩阵(或你所拥有的任何转换内容) not 不能用于转换控制面板。