![]() |
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]() ![]() ![]() |
|
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Здравствуйте, уважаемые знатоки OpenGL!
Хотелось бы узнать, возможно ли в OGL сделать рисование по маске. Поясню подробнее вопрос. Допустим, имеется окно. Хотелось бы задать в этом окне произвольную форму, например, полукруг (требуется не прямоугольная форма, а "кругоподобная"). И уже после указания этой формы хотелось бы иметь возможность рисования только в ней. Например, я рисую залитый прямоугольник, в который вписана та форма, и на выходе получаю залитый полукруг. Т.е. изображение отсеклось по краям заданной области. Возможно ли такое впринципе и какие стандартные средства для этого можно использовать (без использования GLUT)? --------------------
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Есть такая функция glStencilFunc она позволяет задавать какие пикселы выводить а какие нет.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Спасибо, Alexis! Нашел всю необходимую инфу и все получилось.
Если кто тоже занимается акой проблемой, то вот вам моё решение:
И не забываем отключать Stencil test там, где он не нужен. Иначе у вас будут лишние тормоза. --------------------
|
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Ну вот, рано я обрадовался
![]() --------------------
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Может OpenGl инициализируюется по другому? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
То есть? Вроде бы об инициализации самого OGL речи не велось..
Вообще у программки довольно странное поведение. Вот например
вызвращает ошибку 1282 (GL_INVALID_OPERATION). А если ширину линии ставим до включения теста, то все ок.. Вообще ничего не понимаю ![]() Добавлено через 5 минут и 7 секунд А, нет, с линиями все хорошо. Просто переменная была неицилизирована.. Эх.. Однако, первое применение буфер арасположено перед этими глючным местом в коде, и он-таки не отрабатывает ничего как надо. Он просто не проходит... Вот поэтому у мен я и возникли сомнения, что Stencil test у меня настроен правильно. --------------------
|
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Ага. Кое-что пряснилось. До этого стояли дрова из стандартного набора Висты, а теперь родные NVidia.
Майкрософт использует "нулевой" stencil буффер (0 бит) в своих драйверах, в то время как NVidia и ATI 8-битные буферы. Теперь задача в том, чтобы сменить битность буфера. Насколько я понимаю, это делается в инициализации OpenGl (ChoosePixelFormat и иже с ними ![]() --------------------
|
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Ура!!! Заработало!!!!
![]() ![]() ![]() Люди, документация - это наше всё!!!!! Не ленитесь, читайте, и будет всем счастье! ![]() Проблема была в битности буфера, как и намекал Alexeis. Но теперь проблема в том, чтобы как-то опознать изготовителя видеокарты (а точнее производителя драйверов), чтобы корректно проинициализировать OGL? --------------------
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Грубо говоря дравера OpenGL от Microsoft это вообще не драйвера, а тупая эмуляция без аппаратной поддержки, я не стал бы даже запускать программу на них... Это может быть далеко не первый сюрприз. Я бы посоветовал просто уведомлять юзера о необходимости установки драйверов от производителя. Гм.. а вот как узнать... Ведь имя библиотеки как было так и осталось... Можно пройтись в реестре по спискам установленных программ и поискать там имена инсталях. Можно занести в базу имена вспомогательных библиотек для OpenGl и при загрузке основной проверять загружены ли библиотеки от производителя (по именам). Можно по ChoosePixelFormat проверить доступны ли режимы которые не поддерживает стандартный майкрософтовский. Если нужного режима нет то требовать установку драйверов от производителя.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
ChoosePixelFormat вообще не подойдет, т.к. проверка его идет еще до создания контекста
![]() По поводу просмотра реестра я сразу вспомнил свой опыт с поиском установленного ПО. Там может быть множество вариаций, к тому же производители могут быть с юмором. Придумал вот что. У меня есть утилитка для конфигурирования софтинки моей. Естественно, спрашивать пользователя том, чего у него там стоит и с какими драйверами - это дохлый номер. Никогда не рассчитываю, что пользователь достаточно грамотный в таких вопросах. Поэтому сделал просто. В ту же утилитку добавил небольшую "картинку", созданную при помощи OpenGL с использованием stencil. При сохранении настроек появится вопрос "картинку видим?" ![]() ![]() ![]() ![]() --------------------
|
|||
|
||||
Максим80 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 1.6.2009 Репутация: нет Всего: нет |
я вставил этот код в функцию Display и у меня он не компилируется! может я чето не так делаю? Помогите пожалуйста! Это сообщение отредактировал(а) Максим80 - 19.6.2009, 12:43 |
|||
|
||||
explorer |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: нет Всего: 2 |
Кхм... Хочу немного извиниться за введение в заблуждение
![]() Дело в том, что это код на C#, и он использует специальный контрол с поддержкой OpenGL. Вы же, Максим80, вероятно, работаете с С++. Что в вашем случае надо поправить? Да самую малость (убрать все лишнее, вот так):
Теперь этот пример точно скомпилится. В функцию Display этот код вставлять не надо! Там же создается дисплейный список (для повышения производительности). Так как Display вызывается в цикле, то этот список будет пересоздан несколько тысяч раз. Зачем же так издеваться? ![]() Этот код должен быть помещен в Init() или что-то подобное, где происходит настройка OpenGL (в самый конец, после всх операций по инициализации OpenGL'я). В функцию Dislpay() же нужно вставить вот что:
Но и теперь эффекта маски не будет, ведь StencilTest не включен. Чтобы все заработало, нужно его включить.
После выполнения этого кода будет залита только та область квадрата, которая попала в нашу маску. --------------------
|
||||||
|
|||||||
![]() ![]() ![]() |
Вы можете найти полезным что... | |
|
|
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |