Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242

Непонятны трафареты - новичек

26.01.2020, 13:58. Показов 2703. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот приступил к изучению OpenGL, т.к. всегда безумно хотел заниматься написание графики. Иду по книге OpenGL Суперкнига - Ричард С. Райт-мл, где всё объясняется, но не всегда подробно(по этому я здесь). Всё так хорошо было, ясно, понятно, пока не дошел до трафаретов...

В общем, капаюсь в этом уже пару дней, не могу понять само устройство, как она работает. Нигде нет подробного объяснения, максимум - расписана работа функций. Просто как работает stencil???
Вот, минимальный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
glEnable(GL_DEPTH_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);  
  
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
 
glStencilMask(0x00); // make sure we don't update the stencil buffer while drawing the floor
[draw rect 1]
  
glStencilFunc(GL_ALWAYS, 1, 0xFF); 
glStencilMask(0xFF); 
[draw rect 2]
  
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
glStencilMask(0x00); 
glDisable(GL_DEPTH_TEST);
[draw rect 3]
glStencilMask(0xFF);
glEnable(GL_DEPTH_TEST);
Например glStencilOp - ВЕЗДЕ пишут, что эта функция сравнивает фрагменты(пиксели), со stencil тестом. А потом разные пар-ры: GL_KEEP, GL_ZERO и т.д. - вот это зачем? Это имеется ввиду, что если трафарет-тест пройден, то мы будем держать(GL_KEEP) текущий пар-р в буфере, или занулять его(GL_ZERO)? И что имеется ввиду под "пройдет stencil тест"? Чем определяется его прохождение???

Также, что делает функция glStencilFunc? Тоже не совсем понятно. Это она сравнивает текущий буфер, заполненный чем-то, с тем что я рисую, попиксельно? И, если, например равно(GL_EQUAL) или больше(GL_GREATER), то это больше чего? С чем идет сравнение с одной ячейкой и буфера и моделью: ее цветом, позицией - чем??????

Буду безумно благодарен за объяснение, т.к. уже все СНГшные и иностранные сайты по перерывал. Информация друг от друга особо ничем не отличается.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.01.2020, 13:58
Ответы с готовыми решениями:

Самые популярные (востребованные) BGA трафареты
Всем добра. Поднимаю актуальную тему для новичка по BGA. Столкнулся с такой проблемой, как- заказал из Китая набор BGA трафаретов кол-вом ...

Непонятны функции
Или ссылку на нее..

Непонятны методы
class ChkNum { public bool IsPrime(int x) //задаём метод,параметром которого будет int x,а возвращать значение он будет типа...

4
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
26.01.2020, 14:43
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
уже все СНГшные и иностранные сайты по перерывал. Информация друг от друга особо ничем не отличается.
Тут довольно детально разжевывается...
1
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
26.01.2020, 15:01  [ТС]
zayats80888, всё это уже читал и на хабре и в оригинале(learnopeng.com). Да и везде информация схожа. Даже вот по этой ссылке, на хабре, только рассказывается что означает каждый аргумент функции, не более - например.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
26.01.2020, 17:47
Лучший ответ Сообщение было отмечено MJ_PRUTYG как решение

Решение

Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
только рассказывается что означает каждый аргумент функции, не более
значит не внимательно читаешь.
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
Также, что делает функция glStencilFunc? Тоже не совсем понятно. Это она сравнивает текущий буфер, заполненный чем-то, с тем что я рисую, попиксельно? И, если, например равно(GL_EQUAL) или больше(GL_GREATER), то это больше чего? С чем идет сравнение с одной ячейкой и буфера и моделью: ее цветом, позицией - чем??????
Итак, в случае нашего простого примера трафарета, который мы показали в начале, функция будет такой:


glStencilFunc(GL_EQUAL, 1, 0xFF)

Это говорит OpenGL, что, всякий раз, когда трафаретное значение фрагмента равно ссылочному значению 1, фрагмент проходит тест и рисуется, в противном случае — отбрасывается.
Добавлено через 2 минуты
Цитата Сообщение от MJ_PRUTYG Посмотреть сообщение
А потом разные пар-ры: GL_KEEP, GL_ZERO и т.д. - вот это зачем?
...
Но функция glStencilFunc описывает только то, что OpenGL следует делать с содержимым трафаретного буфера, а не то, как мы можем обновить буфер. Здесь нам на помощь приходит функция glStencilOp.


Функция glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass) содержит три параметра, с помощью которых мы можем определить действия для каждого варианта:


sfail: действие, выполняемое в случае провала трафаретного теста.
dpfail: действие, выполняемое в случае, если трафаретный тест пройден, а тест глубины — нет.
dppass: действие, выполняемое в случае, если оба теста пройдены
MJ_PRUTYG,
Ок, попробую пережевать то же самое.
Итак, если ты включил стэнсил тест (glEnable(GL_STENCIL_TEST)), то
каждому пикселю в экранном буфере, сопоставляется "пиксель" (один байт, например) в стэнсил буфере.
При отрисовке объекта, каждый его пиксель(фрагмент) тестируется.
Берется соответствующее этому пикселю значение из стэнсил буфера - stencil,
берется ссылочное значение, заданное в функции glStencilFunc(второй параметр) - ref,
и обрабатывается функцией, заданной первым параметром в функции glStencilFunc(с использованием маски,
заданной там же или в функции glStencilMask), например:
Code
1
2
3
4
    glStencilFunc(
    GL_EQUAL,   // эта функция возвращает (ref & mask) == (stencil & mask)
    1,      // ref
    0xFF)       // mask
И если GL_EQUAL(или то что ты указал первым параметром) возвращает true, то тест пройден и пиксель рисуется в буфер
(если он еще и тест глубины прошел), иначе отбрасывается(не рисуется).
Помимо этого само значение stencil(в буфере) обрабатывается(изменяется, например) согласно параметрам,
указанным в функции glStencilOp, например:
Code
1
2
3
4
    glStencilOp(
    GL_ZERO,    // если тест не пройден, stencil в буфере обнуляется
    GL_INCR,    // если тест пройден, но тест глубины не пройден, ++stencil
    GL_REPLACE) // если тест пройден, и тест глубины пройден, stencil = ref
Надеюсь понятно.

Добавлено через 38 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
с использованием маски,
заданной там же или в функции glStencilMask
Тут я наврал, маска glStencilMask не влияет на сравнение, это другая маска - для записи в стенсил буфер
2
3 / 3 / 0
Регистрация: 28.11.2018
Сообщений: 242
26.01.2020, 19:19  [ТС]
zayats80888, это просто божественное объяснение! Спасибо тебе огромное! Это всё можно и нужно, как я считаю, в книги добавить. Абсолютно все понятно,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.01.2020, 19:19
Помогаю со студенческими работами здесь

Непонятны спецификаторы в printf
Прошу объяснить подробно , что делает строка: #define TRACE(msg, val) printf("TRACE: %*c" msg, 2 * level + 1, ' ', val); Как...

Непонятны некоторые функции
Непонятны следующие функции, что они выполняют: (char)((int)('a')+j)) break; // что значит эта запись? char PROC(char s) // почему...

Непонятны основы электротехники
Пытаюсь разобраться с потенциалами и токами. Нашел учебник по ТОЭ Бессонова. там имеется вот такая схема: ...

Регистрация. непонятны моменты
Вот нашел эту статью, вроде тут неплохо и понятно все написано. Но не понимаю я тут кое-что, если можно объясните ...

Непонятны алгоритмы программ
Объясните, не пойму логику как работают эти 3 программы, есть догадки, но все равно не пойму,кто знает объясните пожалуйста:-| ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru