Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Подумал об этом год или два назад.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top