Чертане на примитив ( 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 сцена? Тъй като съм начинаещ, допълнителни обяснения на модификациите (както и грешки в настоящият код ) и принципите като цяло ще бъдат високо оценени.


РЕДАКТИРАНЕ - след отговор от Рето Коради :

Опитах се да следвам инструкциите и модифицираният код сега изглежда така:

// 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

Сега виждам синьото "четворка", но не се показва правилно, изглежда нещо подобно като това .

Освен това цялата сцена мига много бързо.

Какво трябва да променя в кода си, така че четворката да се показва правилно и екранът да не мига?


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.

Ако искате да начертаете четворката си в 2D координатно пространство, най-лесното решение е изобщо да не използвате 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