Опитвам се да нарисувам 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 сцена? Тъй като съм начинаещ, допълнителни обяснения на модификациите (както и грешки в настоящият код ) и принципите като цяло ще бъдат високо оценени.
РЕДАКТИРАНЕ - след отговор от Рето Коради :
Опитах се да следвам инструкциите и модифицираният код сега изглежда така:
// 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