Как в OpenGL сделать простой фоновый квадрат?

Допустим, я хочу нарисовать простой четырехугольник, например:

glBegin(GL_QUADS);
glVertex2f(-1.0,-1.0);
glVertex2f(1.0,-1.0);
glVertex2f(1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();

Есть ли способ нарисовать это так, чтобы оно отображалось за всеми 3D-объектами и заполняло весь экран? Моя камера двигается вместе с мышью, поэтому этот квадроцикл также должен казаться неподвижным при движении камеры. Цель состоит в том, чтобы сделать простой фон.

Должен ли я делать какие-то сумасшедшие преобразования, основанные на положении/повороте глаз, или есть более простой способ с использованием glMatrixMode()?


person Community    schedule 22.01.2009    source источник


Ответы (3)


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

Итак, сначала:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
int w = glutGet(GLUT_WINDOW_WIDTH);
int h = glutGet(GLUT_WINDOW_HEIGHT);
gluOrtho2D(0, w, h, 0);

Это помещает новую матрицу проекций в стек проекций (я использовал переполнение для этого проекта, но он должен переводиться в обычный OpenGL). Затем я получаю ширину и высоту окна и использую gluOrtho2D для настройки своей ортогональной проекции.

Следующий:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Draw your quad here in screen coordinates

Здесь я просто помещаю новую, чистую матрицу в представление модели. Возможно, вам не нужно этого делать.

Наконец:

glPopMatrix() // Pops the matrix that we used to draw the quad
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // Pops our orthographic projection matrix, which restores the old one
glMatrixMode(GL_MODELVIEW); // Puts us back into GL_MODELVIEW since this is probably what you want

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

РЕДАКТИРОВАТЬ: Отключение тестирования глубины и очистка буфера глубины также могут помочь, как предлагает Boojum.

person Mongoose    schedule 22.01.2009
comment
Важный последний шаг — перед последней строкой добавьте следующее: glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(/*ваши переменные точки зрения*/); Если нет, 3D-модели становятся странными. - person ; 23.01.2009
comment
@jubei Как бы вы сделали это в современном OpenGL? Учебников не хватает. - person Jean Nassar; 08.01.2016
comment
@JeanNassar Ответ на этот вопрос слишком длинный для комментария о переполнении стека. Я предлагаю вам начать новый вопрос! - person Jubei; 08.01.2016

Вот шаги, которые я бы использовал для каждого кадра:

  1. Очистите буфер глубины с помощью glClear(GL_DEPTH_BUFFER_BIT);
  2. Отключите проверку глубины с помощью glDisable(GL_DEPTH_TEST);
  3. Загрузить в фиксированной ортогональной проекции с помощью gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
  4. Нарисуйте свой четырехугольник так, как вы его описали.
  5. Снова включите проверку глубины.
  6. Загрузите свои обычные перспективные проекции и нарисуйте остальную часть вида.
person Boojum    schedule 22.01.2009
comment
Именно то, что я только что пытался сформулировать на английском :) - person workmad3; 22.01.2009

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

person Rolf Anders    schedule 22.01.2009