| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Рисование в заданной области |
| Автор: explorer 20.5.2009, 09:56 |
| Здравствуйте, уважаемые знатоки OpenGL! Хотелось бы узнать, возможно ли в OGL сделать рисование по маске. Поясню подробнее вопрос. Допустим, имеется окно. Хотелось бы задать в этом окне произвольную форму, например, полукруг (требуется не прямоугольная форма, а "кругоподобная"). И уже после указания этой формы хотелось бы иметь возможность рисования только в ней. Например, я рисую залитый прямоугольник, в который вписана та форма, и на выходе получаю залитый полукруг. Т.е. изображение отсеклось по краям заданной области. Возможно ли такое впринципе и какие стандартные средства для этого можно использовать (без использования GLUT)? |
| Автор: Alexeis 20.5.2009, 18:13 |
| Есть такая функция glStencilFunc она позволяет задавать какие пикселы выводить а какие нет. |
| Автор: explorer 21.5.2009, 13:29 | ||
| Спасибо, Alexis! Нашел всю необходимую инфу и все получилось. Если кто тоже занимается акой проблемой, то вот вам моё решение:
И не забываем отключать Stencil test там, где он не нужен. Иначе у вас будут лишние тормоза. |
| Автор: explorer 21.5.2009, 15:22 |
| Ну вот, рано я обрадовался |
| Автор: Alexeis 21.5.2009, 15:28 |
Может OpenGl инициализируюется по другому? |
| Автор: explorer 21.5.2009, 15:59 | ||
| То есть? Вроде бы об инициализации самого OGL речи не велось.. Вообще у программки довольно странное поведение. Вот например
вызвращает ошибку 1282 (GL_INVALID_OPERATION). А если ширину линии ставим до включения теста, то все ок.. Вообще ничего не понимаю Добавлено через 5 минут и 7 секунд А, нет, с линиями все хорошо. Просто переменная была неицилизирована.. Эх.. Однако, первое применение буфер арасположено перед этими глючным местом в коде, и он-таки не отрабатывает ничего как надо. Он просто не проходит... Вот поэтому у мен я и возникли сомнения, что Stencil test у меня настроен правильно. |
| Автор: explorer 22.5.2009, 11:06 |
| Ага. Кое-что пряснилось. До этого стояли дрова из стандартного набора Висты, а теперь родные NVidia. Майкрософт использует "нулевой" stencil буффер (0 бит) в своих драйверах, в то время как NVidia и ATI 8-битные буферы. Теперь задача в том, чтобы сменить битность буфера. Насколько я понимаю, это делается в инициализации OpenGl (ChoosePixelFormat и иже с ними |
| Автор: explorer 22.5.2009, 11:29 |
| Ура!!! Заработало!!!! Люди, документация - это наше всё!!!!! Не ленитесь, читайте, и будет всем счастье! Проблема была в битности буфера, как и намекал Alexeis. Но теперь проблема в том, чтобы как-то опознать изготовителя видеокарты (а точнее производителя драйверов), чтобы корректно проинициализировать OGL? |
| Автор: Alexeis 22.5.2009, 13:11 |
| Грубо говоря дравера OpenGL от Microsoft это вообще не драйвера, а тупая эмуляция без аппаратной поддержки, я не стал бы даже запускать программу на них... Это может быть далеко не первый сюрприз. Я бы посоветовал просто уведомлять юзера о необходимости установки драйверов от производителя. Гм.. а вот как узнать... Ведь имя библиотеки как было так и осталось... Можно пройтись в реестре по спискам установленных программ и поискать там имена инсталях. Можно занести в базу имена вспомогательных библиотек для OpenGl и при загрузке основной проверять загружены ли библиотеки от производителя (по именам). Можно по ChoosePixelFormat проверить доступны ли режимы которые не поддерживает стандартный майкрософтовский. Если нужного режима нет то требовать установку драйверов от производителя. |
| Автор: explorer 24.5.2009, 10:04 |
| ChoosePixelFormat вообще не подойдет, т.к. проверка его идет еще до создания контекста По поводу просмотра реестра я сразу вспомнил свой опыт с поиском установленного ПО. Там может быть множество вариаций, к тому же производители могут быть с юмором. Придумал вот что. У меня есть утилитка для конфигурирования софтинки моей. Естественно, спрашивать пользователя том, чего у него там стоит и с какими драйверами - это дохлый номер. Никогда не рассчитываю, что пользователь достаточно грамотный в таких вопросах. Поэтому сделал просто. В ту же утилитку добавил небольшую "картинку", созданную при помощи OpenGL с использованием stencil. При сохранении настроек появится вопрос "картинку видим?" |
| Автор: Максим80 19.6.2009, 12:39 | ||
я вставил этот код в функцию Display и у меня он не компилируется! может я чето не так делаю? Помогите пожалуйста! |
| Автор: explorer 25.6.2009, 13:53 | ||||||
| Кхм... Хочу немного извиниться за введение в заблуждение Дело в том, что это код на C#, и он использует специальный контрол с поддержкой OpenGL. Вы же, Максим80, вероятно, работаете с С++. Что в вашем случае надо поправить? Да самую малость (убрать все лишнее, вот так):
Теперь этот пример точно скомпилится. В функцию Display этот код вставлять не надо! Там же создается дисплейный список (для повышения производительности). Так как Display вызывается в цикле, то этот список будет пересоздан несколько тысяч раз. Зачем же так издеваться? Этот код должен быть помещен в Init() или что-то подобное, где происходит настройка OpenGL (в самый конец, после всх операций по инициализации OpenGL'я). В функцию Dislpay() же нужно вставить вот что:
Но и теперь эффекта маски не будет, ведь StencilTest не включен. Чтобы все заработало, нужно его включить.
После выполнения этого кода будет залита только та область квадрата, которая попала в нашу маску. |