OpenGL - Тест за шаблон в правоъгълник

Смятам да нарисувам правоъгълник с дупка в центъра. Опитвам се да използвам шаблонния тест върху него, но не мога да го накарам да работи. Можете да видите по-долу как го правя.

glEnable(GL_STENCIL_TEST);
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS, 2, ~0);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
// Draw the rectangle here
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 2, ~0);
glStencilOp(GL_INCR, GL_INCR, GL_INCR);

Какво правя грешно тук? Всяка помощ ще бъде много оценена! :)


person zyneragetro    schedule 28.09.2015    source източник
comment
Това просто настройва писането на 2 в буфера на шаблона (ако приемем, че е достатъчно дълбок), след това кода за изтегляне тук, който ще запише това 2 където и да рисува, и след това настройва шаблона да рисува само там, където е написано 2. Това не отговаря много на текстовото описание. Можете ли да покажете по-пълен (псевдо) пример за код?   -  person Angew is no longer proud of SO    schedule 28.09.2015
comment
@Angew - Това е единственият код, който имам за теста на шаблона. Аз съм нов в това и наистина бих искал да науча как трябва да се направи. Тегленето тук е просто свързване на буфер към opengl и извикване на glDrawArrays. Няма какво повече да ти дам от това.   -  person zyneragetro    schedule 28.09.2015


Отговори (1)


Предполагам, че вашата ситуация е, че вече имате нещо начертано в буфера на кадрите и сега искате да нарисувате правоъгълник с дупка в него, така че да не покрива това, което е под дупката, но да покрива това, което не е под недупката част.

Логично това означава, че първо начертавате дупката в буфера на шаблона и след това използвате теста на шаблона, за да изключите тези фрагменти, когато рисувате правоъгълника.

В кода изглежда нещо подобно:

glEnable(GL_STENCIL_TEST);

// Fill stencil buffer with 0's
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);

// Write 1's into stencil buffer where the hole will be
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
drawHoleShape();

// Draw rectangle, masking out fragments with 1's in the stencil buffer
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glStencilFunc(GL_NOTEQUAL, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
drawRectangle();

// Cleanup, if necessary
glDisable(GL_STENCIL_TEST);

Разбира се, можете да използвате 2 (или всеки друг шаблонен бит/стойност) вместо 1.

person Angew is no longer proud of SO    schedule 28.09.2015
comment
Благодаря ти за примера. Първо ще пробвам това :) - person zyneragetro; 28.09.2015
comment
Съжалявам за късния отговор. Следвах алгоритъма по-горе и изглежда, че каквото и да нарисувам във формата на отвора за изтегляне, изчезва и единственото нещо, което виждам, все още е целият правоъгълник. - person zyneragetro; 29.09.2015
comment
@zyneragetro Току-що ми хрумна нещо - наистина ли сте създали шаблонен буфер във вашия контекст? напр. когато използвате GLUT, това ще стане чрез добавяне на GLUT_STENCIL към аргументите на glutInitDisplayMode. - person Angew is no longer proud of SO; 01.10.2015
comment
не Това, което ми даде по-горе, е единственото, което написах. Какво се случва, когато създадете шаблонен буфер? - person zyneragetro; 05.10.2015
comment
@zyneragetro Можете да го използвате. Не можете да пишете в стенцил буфер, ако нямате такъв. - person Angew is no longer proud of SO; 05.10.2015
comment
Благодаря, но изглежда не мога да намеря какво е еквивалентният glutInitDisplayMode, когато не използвам GLUT. - person zyneragetro; 05.10.2015
comment
@zyneragetro Добре тогава, какво използвате вместо GLUT? Между другото, моля, не очаквайте от мен магически да осигуря 100% цялостно решение с всички зачертани т и точки; SO не е за това. Повече от щастлив съм да помогна, но очаквам проучване и усилия и от ваша страна. - person Angew is no longer proud of SO; 05.10.2015
comment
Изчакайте. Сега съм объркан, но в заглавката си импортирам този OpenGL/gl.h, опитах glutInitDisplayMode, но няма да работи, търсих и все още не мога да намеря нищо и също така не се притеснявайте, тъй като не ви очаквам да отговоря на всичко :) - person zyneragetro; 05.10.2015
comment
@zyneragetro GLUT не е част от самия GL, това е малка помощна библиотека за управление на свързани, но не-GL неща, като създаване на прозорец и контекст. Какво използвате, за да получите GL-съвместим прозорец на екрана? Именно в that трябва по някакъв начин да активирате буфера на шаблона. - person Angew is no longer proud of SO; 05.10.2015
comment
Използвам EGL и досега не мога да намеря как да активирам еквивалента на GLUT_STENCIL. Все още проучвам и чета документация как да го направя. - person zyneragetro; 07.10.2015
comment
@zyneragetro Никога не съм използвал EGL, но преглеждам спец., изглежда, че трябва да разгледате неща като eglChooseConfig и EGL_STENCIL_SIZE (раздел 3.4). - person Angew is no longer proud of SO; 07.10.2015
comment
Благодаря :) Просто ще ви информирам, след като намеря правилното нещо, което да използвам. Благодаря за търпението и отделеното време :D - person zyneragetro; 07.10.2015
comment
Използвайки отговора по-горе, който публикувахте, плюс информацията, която сте дали за активиране на буфера за шаблони, проблемът ми е решен! Благодаря :) - person zyneragetro; 08.10.2015