Как в OpenGL создать простой фоновый четырехугольник?

StackOverflow https://stackoverflow.com/questions/468297

Вопрос

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

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()?

Это было полезно?

Решение

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

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

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

Другие советы

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

<Ол>
  • Очистите буфер глубины с помощью glClear(GL_DEPTH_BUFFER_BIT);
  • Отключите проверку глубины с помощью glDisable(GL_DEPTH_TEST);
  • Загрузка в фиксированной ортографической проекции с помощью gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
  • Нарисуйте свой квад, как вы его описали.
  • Снова включите проверку глубины.
  • Загрузите ваши обычные перспективные проекции и нарисуйте остальную часть вида.
  • Не могу просто поместить его на задний план, уложить себя, если хотите, чтобы все вокруг вас. Вам нужно сначала нарисовать его, чтобы он был позади всех объектов.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top