Увеличение без масштабирования графики

Я изучаю Opengl для 2D (в частности, используя библиотеку java slick2D, но это может не быть фактором для этого вопроса). Я обнаружил, что могу изменить новую матрицу преобразования, например, чтобы преобразовать мировые координаты в координаты экрана (просмотра).

Я хочу использовать это для увеличения изображения, увеличения расстояния между объектами, но как только это будет сделано, я хочу рисовать изображения и формы в координатах экрана, как HUD. По сути, я хочу, чтобы координаты менялись, но графика оставалась прежней, поэтому я могу отображать пользовательские изображения в каждом масштабе.

Можно ли это сделать с помощью какого-нибудь умного преобразования или какой-нибудь опции OpenGL вместо того, чтобы вручную вычислять все координаты?


person Daniel Langdon    schedule 19.04.2013    source источник


Ответы (2)


  1. Очистить буферы цвета и глубины

  2. Установка матриц проекции / вида модели для увеличенного 2D / 3D рендеринга

  3. Включить тест глубины

  4. Рендеринг 2D / 3D сцены с увеличенным масштабом

  5. Сбросить проекцию / вид модели для 2D-наложения

  6. Отключить тест глубины

  7. Нарисовать 2D-наложение

  8. Повторить

person genpfault    schedule 19.04.2013
comment
На самом деле я не это имел в виду. Нет отдельных 2D и 3D, только масштабно-инвариантная 2D-сцена. Но я только что разобрался сам. Обдумывать пачку преобразований определенно нетривиально. Я голосовал за ваш ответ, так как он до сих пор полезен, но на всякий случай поставлю правильный. Большое спасибо! - person Daniel Langdon; 20.04.2013

Хорошо, разобрался, надо использовать две отдельные проекции:

1.- Масштабируйте мировые координаты, чтобы объекты рисовались в правильных местах сцены:

    g.pushTransform();

    // Always zoom in the center of the screen.
    g.translate(resolution.getX(), resolution.getY());
    g.scale(scale, scale);

    // Move the view
    g.translate(-view.getX(), -view.getY());

2.- Нажмите новую матрицу, чтобы нарисовать объект, инвертируя преобразование масштаба, чтобы графика объекта не изменялась вместе с масштабом:

    g.pushTransform();

    // Center on the current object.
    g.translate(pos.x, pos.y);

    // Undo scaling of graphics!
    g.scale(1.0f/scale, 1.0f/scale);
person Daniel Langdon    schedule 19.04.2013