В OpenGL, как мне сделать простой фоновый квад? - PullRequest
3 голосов
/ 22 января 2009

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 22 января 2009

Похоже, то, что вы хотите сделать, похоже на то, что вы делаете, когда рисуете 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.

3 голосов
/ 22 января 2009

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

  1. Очистить буфер глубины с помощью glClear(GL_DEPTH_BUFFER_BIT);
  2. Отключить проверку глубины с помощью glDisable(GL_DEPTH_TEST);
  3. Загрузка в фиксированной ортографической проекции с gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
  4. Нарисуйте свой квад, как вы его описали.
  5. Включить тестирование глубины.
  6. Загрузите ваши обычные перспективные проекции и нарисуйте остальную часть вида.
0 голосов
/ 22 января 2009

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

...