OpenGL координирует вопрос - PullRequest
1 голос
/ 25 марта 2010

У меня есть простой рисунок OpenGL. Когда пользователь меняет размер окна, я хочу, чтобы рисунок сохранял пропорции. Я достиг этого, установив glViewport на максимальный прямоугольник с соответствующим соотношением сторон при вызове метода изменения формы.

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

Может кто-нибудь объяснить, как это сделать?

Спасибо,

Ответы [ 4 ]

1 голос
/ 25 марта 2010

Один из способов сделать это - создать новую орто-матрицу, которая отображается в пиксельные координаты (left = 0, bottom = 0, right = window-width, top = window-height) и установить область просмотра gl для все окно всякий раз, когда окно меняется. Таким образом, вы можете нарисовать квадрат, указав пиксельные координаты, если убедитесь, что у вас настроена матрица представления идентичной модели.

Хотя это не единственный способ. Независимо от того, какое у вас несингулярное преобразование, вы сможете найти способ попадания в правильные пиксели, если их отображает gl-viewport, так будет проще.

1 голос
/ 25 марта 2010

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

0 голосов
/ 25 марта 2010

Если я правильно понимаю, вы хотите нарисовать квадрат в верхнем правом углу окна , независимо от того, где расположена ваша сцена область просмотра .

Самый простой способ сделать это - после рендеринга обычной сцены с нужным аспектом изменить область просмотра gl на квадрат, который вы хотите нарисовать в верхнем углу. Затем нарисуйте «полноэкранный» квад для заполнения квадрата, и в этом случае фактически полноэкранный режим становится полнопроходным.

Непроверенный полупсевдокод будет выглядеть примерно так:

// Draw normal scene
glViewport(x, y, w, h);
drawScene();

// Draw top-right red square
glViewport( windowWidth - squareWidth, windowHeight - squareHeight,
            squareWidth, squareHeight );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glColor3f(1.f, 0.f, 0.f);
glRectf(-1.f, -1.f, 1.f, 1.f);

Убедиться, что обмотка glRectf соответствует вашей текущей конфигурации грани. В качестве альтернативы, просто временно отключите выборку с помощью glDisable (GL_CULL_FACE) / glEnable (GL_CULL_FACE).

0 голосов
/ 25 марта 2010

Чтобы нарисовать квадрат в верхнем правом углу окна, вам нужно окно просмотра, чтобы покрыть эту область. Наличие окна просмотра меньше окна не позволяет рисовать в углу.

Вы хотите, чтобы ваш видовой экран покрывал все окно (как обычно делается), и ваши квадратные координаты должны быть сопоставлены с чем-то вроде:

X0 = 1-2*s/width
X1 = 1
Y0 = 1-2*s/height
Y1 = 1

, где s - это сторона квадрата (в пикселях), а width, height - размеры окна (в пикселях).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...