Рисование примитива ( GL_QUADS ) поверх 2D-текстуры - четырехугольник не визуализируется, цвет текстуры изменен

Я пытаюсь нарисовать 2D-сцену с текстурой в качестве фона, а затем (по мере выполнения программы и вычислений) рисовать различные примитивы на «холсте». В качестве теста я хотел нарисовать синий квадрат на фоновом изображении.

Я просмотрел несколько ресурсов и вопросов SO, чтобы попытаться получить информацию, необходимую для выполнения задачи (например, это руководство для первого примитивного рендеринга, "пример" SOIL для загрузки текстуры) .

Я так понял, что текстура будет отрисовываться на Z=0, а также на quad. Таким образом, Quad «покрывает» часть текстуры - рисуется на ней, чего я и хочу. Вместо этого результатом моей функции отображения является моя исходная текстура в черном/синем цвете, а не моя текстура (в исходном цвете) с нарисованным на ней синим четырехугольником. Это код функции дисплея:

void display (void) {

glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT);

// background render

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 1024.0, 512.0, 0.0, 0.0, 1.f); // window size is 1024x512

glEnable( GL_TEXTURE_2D ); 
glBindTexture( GL_TEXTURE_2D, texture );

glBegin (GL_QUADS);
glTexCoord2d(0.0,0.0); glVertex2d(0.0,0.0);
glTexCoord2d(1.0,0.0); glVertex2d(1024.0,0.0);
glTexCoord2d(1.0,1.0); glVertex2d(1024.0,512.0);
glTexCoord2d(0.0,1.0); glVertex2d(0.0,512.0);
glEnd(); // here I get the texture properly displayed in window

glDisable(GL_TEXTURE_2D);

// foreground render

glLoadIdentity();
gluPerspective (60, (GLfloat)winWidth / (GLfloat)winHeight, 1.0, 100.0);

glMatrixMode(GL_MODELVIEW);

glColor3f(0.0, 0.0, 1.0);

glBegin (GL_QUADS);
glVertex2d(400.0,100.0);
glVertex2d(400.0,500.0);
glVertex2d(700.0,100.0);
glVertex2d(700.0,500.0);
glEnd(); // now instead of a rendered blue quad I get my texture coloured in blue

glutSwapBuffers();  }

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

Как мне изменить свой код, чтобы он корректно отображал четырехугольник поверх изображения фоновой текстуры моей 2D-сцены? Так как я новичок, дополнительные объяснения модификаций (а также ошибки в настоящий код ) и принципы в целом будут высоко оценены.


EDIT - после ответа Рето Коради:

Я попытался следовать инструкциям, и измененный код теперь выглядит так:

// foreground render

glLoadIdentity();
glMatrixMode(GL_MODELVIEW);

glOrtho(0.0f, 1024.0, 512.0, 0.0, 0.0, 1.f);
glColor3f(0.0, 0.0, 1.0);

glBegin (GL_QUADS); // same from here on

Теперь я вижу синий «квадрат», но он отображается неправильно, выглядит примерно так like this .

Кроме того, вся сцена мигает очень быстро.

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


person James C    schedule 19.08.2014    source источник
comment
Ваш квадроцикл обрезает фоновую текстуру? то есть они находятся в одном и том же положении Z.   -  person    schedule 19.08.2014
comment
Есть разница между рендерингом четырехугольника на текстуре и рендерингом его в той же позиции, что и текстура.   -  person    schedule 19.08.2014
comment
отключить тестирование глубины при выполнении 2D.   -  person yngccc    schedule 19.08.2014
comment
@yngum - у меня нигде в коде нет glEnable(GL_DEPTH_TEST);. Но есть glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); в основном.   -  person James C    schedule 19.08.2014


Ответы (1)


Вы настраиваете преобразование перспективы перед рендерингом синего четырехугольника:

glLoadIdentity();
gluPerspective (60, (GLfloat)winWidth / (GLfloat)winHeight, 1.0, 100.0);

То, как определяется gluPerspective(), устанавливает преобразование, которое смотрит от начала координат вниз по отрицательной оси Z, при этом значения near и far определяют диапазон расстояний, который будет видимым. При таком преобразовании будут видны значения z от -1,0 до -100,0. Который не включает ваш четырехугольник на z = 0.0.

Если вы хотите нарисовать свой четырехугольник в двухмерном координатном пространстве, самое простое решение — вообще не использовать gluPerspective(). Просто используйте преобразование типа glOrtho(), как вы сделали для своего первоначального рисунка.

Если вам нужна перспектива, вам также понадобится трансформация GL_MODELVIEW. Вы можете начать с перемещения в отрицательном направлении по оси Z в диапазоне от 1,0 до 100,0. Возможно, вам также придется настроить свои координаты для другой системы координат или использовать дополнительные преобразования, которые также преобразуются в направлении xy и, возможно, масштабируются.

Код также имеет координаты в неправильном порядке для рисования синего четырехугольника. Вам нужно либо изменить вызов отрисовки на GL_TRIANGLE_STRIP (рекомендуется, потому что он, по крайней мере, приближает вас на один шаг к использованию функций, которые не являются устаревшими), либо поменять местами порядок последних двух вершин:

glBegin (GL_QUADS);
glVertex2d(400.0,100.0);
glVertex2d(400.0,500.0);
glVertex2d(700.0,500.0);
glVertex2d(700.0,100.0);
glEnd(GL_QUADS);
person Reto Koradi    schedule 19.08.2014
comment
Спасибо за ваш ответ. Я пытался следовать вашим инструкциям, но, к сожалению, безуспешно. Пожалуйста, смотрите мой отредактированный (расширенный) вопрос. - person James C; 19.08.2014
comment
Я добавил к ответу, почему квадроцикл выглядит неправильно. Насчет перепрошивки не уверен. Скорее всего, это совершенно другая проблема, выходящая за рамки первоначального вопроса. - person Reto Koradi; 20.08.2014