2011-07-20 37 views
1

我正在研究构建游戏内容的关卡生成器应用程序。 iPad屏幕的一部分是一个专用的控制面板,其余部分是正在构建的级别的图形表示。我需要放大和缩小水平区域而不影响控制面板。我使用OpenGL ES进行渲染。任何人都可以在这里给我一些指点吗?我是否可以用不同的视口分割屏幕,然后缩放一个?iOS - 仅使用openGL ES缩放显示的一部分

回答

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 

矩阵(或者你有任何转变的东西),你使用的转化水平应该用于转化的控制面板。

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(); 
} 

最重要的部分是,你设置视口/剪刀和之前渲染的子部分的拉丝处理程序中的投影。