iOS - масштабирование только части экрана с использованием openGL ES - PullRequest
1 голос
/ 20 июля 2011

Я работаю над приложением для создания уровней для создания контента для игры.Часть экрана iPad представляет собой специальную панель управления, а остальная часть представляет собой графическое представление создаваемого уровня.Мне нужно увеличивать и уменьшать область уровня, не затрагивая панель управления.Я использую openGL ES для рендеринга.Кто-нибудь может дать мне несколько советов здесь?Могу ли я разделить экран по разным областям просмотра и просто масштабировать один?

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Хитрость заключается в том, чтобы понять, что 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 голос
/ 20 июля 2011

Если вы выполняете рендеринг с помощью 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

Матрицы (или любые другие вещи, которые у вас есть), которые вы используете для преобразования уровня, должны не использоваться для преобразования панели управления.

...