Я пытаюсь нарисовать 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
Теперь я вижу синий «квадрат», но он отображается неправильно, выглядит примерно так .
Кроме того, вся сцена мигает очень быстро.
Что мне нужно изменить в моем коде, чтобы четырехугольник отображался правильно, а экран не мигал?
glEnable(GL_DEPTH_TEST);
. Но естьglutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
в основном. - person James C   schedule 19.08.2014