OpenGL эквивалент GDI HatchBrush или PatternBrush? - PullRequest
1 голос
/ 06 июня 2010

У меня есть приложение VB6 (пожалуйста, не смейтесь), которое много рисует через BitBlt и стандартные функции рисования VB6.Я сталкиваюсь с проблемами производительности (да, я делаю обычные трюки, такие как рисование в память).Итак, я решил исследовать другие способы рисования и наткнулся на OpenGL.

Я проводил некоторые эксперименты, и кажется, что делать большую часть того, что я хочу, довольно просто;в основном приложение использует только очень простое рисование - относительно большие 2D-прямоугольники сплошных цветов и т. д. - но я не смог найти эквивалента чему-то вроде HatchBrush или PatternBrush.

Точнее, яхотите иметь возможность указать небольшой монохромный пиксельный рисунок, выбрать цвет, и всякий раз, когда я рисую многоугольник (или что-то еще), вместо того, чтобы он был сплошным, он автоматически покрывался мозаикой с этим рисунком, не переводился, не поворачивался, не перегибался и не растягивался,с битами «вкл.» шаблона, отображаемыми в указанном цвете, и битами «выкл.» в шаблоне слева, отображающими все, что было нарисовано в области, на которой я сейчас рисую.

Очевидно, я могвсе расчеты делаю сам.То есть вместо рисования в виде многоугольника, который каким-то образом будет автоматически вычленен для меня, я мог бы рассчитать все линии или пиксели или все, что нужно на самом деле рисовать, а затем нарисовать их в виде линий или пикселей или что-то еще.Но есть ли более простой способ?Как в GDI, где вы просто говорите «нарисовать этот многоугольник, используя эту кисть»?

Я предполагаю, что «текстуры» могли бы выполнить то, что я хочу, но мне это не ясно (я полностьюплохо знакомый с этим и документация, которую я нашел, не совсем очевидна);Кажется, что текстуры могут искажать или переводить или растягивать рисунок, основываясь на вершинах многоугольника?Принимая во внимание, что я хочу, чтобы рисунок был мозаичным.

Есть ли способ сделать это или что-то в этом роде, кроме вычисления грубой силы точно пикселей / линий / чего бы это ни было нужно нарисовать?

Заранее спасибо за любую помощь.

Ответы [ 5 ]

2 голосов
/ 06 июня 2010

Если я правильно понял, вы ищете glPolygonStipple () или glLineStipple () .

PolygonStipple очень ограничен, так как допускает только 32x32 паттерна, но он должен работать как PatternBrush. Я понятия не имею, как реализовать это в VB.

1 голос
/ 06 июня 2010

Прежде всего, вы уверены, что именно операция рисования является узким местом здесь? Visual Basic известен как очень медленный ( Особенно , если ваша программа скомпилирована с промежуточным кодом VM - который является AFAIRC по умолчанию. Убедитесь, что вы отметили опцию компиляции в собственный код!), И если это если ваш код является узким местом, то OpenGL вам не сильно поможет - вам нужно переписать код на другом языке - возможно, на C или C ++, но любой язык .NET также должен подойти.

OpenGL содержит функции, которые позволяют рисовать пунктирные линии и многоугольники, но вы не должны их использовать. Они давно устарели и были удалены из OpenGL в версии 3.1 спецификации. И это по причине - эти функции плохо соответствуют современной парадигме рендеринга и не поддерживаются современным графическим оборудованием - это означает, что вы, скорее всего, получите медленный программный откат, если будете их использовать.

Для этого нужно использовать небольшую текстуру в качестве маски и наложить ее на нарисованные многоугольники. Текстура будет растянута или сжата в соответствии с указанными вами координатами текстуры. Вы должны установить режим обтекания на GL_REPEAT для обеих координат текстуры и вычислить правильные координаты для каждой вершины, чтобы текстура появлялась в своем первоначальном размере, повторяя правильное количество раз.

Вы также можете использовать буфер трафарета, как вы описали, но ... как бы вы заполнили этот буфер шаблоном и сделали бы это fast ? Вам все равно понадобится текстура. Помните, что вам нужно очищать буфер трафарета каждый кадр, прежде чем начинать рисовать. Невыполнение этого требования может стоить вам массивного снижения производительности (точное значение «массивного» зависит от графического оборудования и версии драйвера).

Также возможно достичь желаемого эффекта, используя фрагментный шейдер, но изучение шейдеров для этого было бы излишним для начинающего OpenGL, такого как вы: -).

0 голосов
/ 07 июня 2010
0 голосов
/ 06 июня 2010

Вы можете просто использовать текстуру. Поместите рисунок как на картинке и включите повторение текстуры, и все готово.

0 голосов
/ 06 июня 2010

Ах, я думаю, что нашел это! Я могу создать трафарет по всему окну просмотра в форме нужного мне шаблона (или его маски, я думаю), а затем включить этот трафарет, когда я хочу рисовать с этим шаблоном.

...