Есть ли способ выразить инструкции OpenGL независимо от языка?

Название в значительной степени говорит об этом. Я думал о создании простого видеоредактора и не был уверен в "логистике" различных эффектов, фильтров и тому подобного. Допустим, я хочу, чтобы внешняя программа применила некоторый эффект к изображению. Обязательно ли это исполняемая программа или это может быть просто набор инструкций OpenGL, которые видеоредактор может анализировать и, по сути, "передавать" в OpenGL. Технически, это была бы программа, но она кажется более элегантной и стандартизированной, чем создание полноценной вторичной программы только для применения эффекта. Может быть, есть лучший способ?

Редактировать: Спасибо за ответы, ребята. Вот продолжение: Как другие видеоредакторы реализуют это? Причина, по которой я спрашиваю, заключается в том, что ответы на этот вопрос кажутся довольно негативными, поэтому мне было интересно, как это делается в профессиональных приложениях.

5 ответов

Решение

Обязательно ли это исполняемая программа или это может быть просто набор инструкций OpenGL, которые видеоредактор может анализировать и, по сути, "передавать" в OpenGL.

Есть несколько способов решения проблемы ("сделать видеоредактор с возможностью создания пользовательских эффектов").

  1. Сделайте так, чтобы ваш редактор поддерживал плагины, и предоставьте API для создания новых плагинов для видеоэффектов. Директор Macromedia работал таким образом. Новый эффект должен быть реализован в виде библиотеки плагинов (dll/.so, в зависимости от вашей платформы).
  2. Встраивайте язык сценариев с привязками OpenGL в ваше приложение для создания видеоэффектов, предоставляйте базовые функции для взаимодействия с внутренним состоянием вашего приложения. Это позволит быстрее разрабатывать эффекты, но производительность будет сильно снижаться для определенных операций. "Blender" (3D-редактор) работает таким образом, Maya предоставляет аналогичные рамки (я думаю). По сути, это # ​​1, но реализовано как язык сценариев.
  3. Сделайте так, чтобы ваш редактор загружал шейдеры GLSL. Это позволит вам делать некоторые эффекты довольно быстро, но кроме этого это не очень хорошая идея - хотя GLSL обладает приличным количеством "мощности" (функции / математика), один GLSL не позволит вам делать все, что вы хотите, потому что он вообще не сможет взаимодействовать с вашим приложением (чистый GLSL не может создавать текстуры, кадровые буферы и т. д., что ограничивает вашу способность делать что-то более интересное). Скорее всего, вы сможете только сделать какой-то фильтр, не более того. #1 и #2 дадут "власть" конечному пользователю.
  4. Реализуйте редактор эффектов на основе узлов. Т.е. существует несколько типов узлов, которые пользователь может перетаскивать, которые представляют определенные операции, у них есть входы / выходы, и пользователь может их подключать. Blender 3D и UDK(Unreal Development Kit) имеют такую ​​функцию. Я думаю, что.kkreiger (сайт не работает, Google это) использовал аналогичную технику, чтобы сделать 96kb шутер от первого лица. Это может быть довольно мощным, но программисты, скорее всего, будут ненавидеть перетаскивание графических объектов с помощью мыши, если только вы не предоставите способ создания такого графа узлов с помощью языка сценариев (в AviSynth было что-то похожее, но не совсем такое). Это может быть так же мощно, как # 1 или #2, но будет стоить вам дополнительного времени разработки.

Кроме того, не существует "независимого от языка" способа добиться эффекта. Либо вы должны использовать существующий язык, чтобы плагин эффекта взаимодействовал с вашим приложением, либо вы должны создать свой собственный "язык" для описания эффекта. Единственный независимый от языка способ справиться с этим - нанять программиста и сказать ему, какой эффект вы хотите получить. Но опять же, это требует естественного языка.

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

Любая вещь работает. Однако в самом стандарте OpenGL нет такого понятия, как "инструкции OpenGL" или "коды операций". Но по крайней мере в системах на основе X11 с косвенным GLX это возможно, потому что GLX фактически определяет коды операций. И несколько X-клиентов могут работать в одном и том же контексте, если он косвенный. К сожалению, у вас не будет этой опции в большинстве случаев, так как вам, вероятно, нужен прямой контекст, потому что вы можете захотеть OpenGL3 (для которого не все операции имеют коды операций, определяющие, что делает косвенные невозможными для OpenGL-3), или потому что вы ' не использовать GLX

Таким образом, следующий вариант заключается в том, что вы предоставляете другому процессу какую-то подсказку команды / интерпретатора для OpenGL. Если вы ленивы, я предлагаю вам просто встроить интерпретатор Python в вашу программу вместе с привязками Python OpenGL. Они работают в любом контексте, который в данный момент активен, что позволяет другой программе фактически отправлять некоторый скрипт Python для выполнения своих задач.

И последнее, но не менее важное: вы можете предоставить OpenGL через некоторый интерфейс RPC.

Или вы предоставляете некоторую систему плагинов, где вы загружаете какую-то DLL, которая выполняет действия.

Конечно, но это было бы в основном эквивалентно тому, что вы создаете свой собственный язык. Вы можете принять "инструкции" OpenGL от пользователя через некоторый текстовый интерфейс (или, если вы хотите каким-то образом собрать что-то вместе в виде графического интерфейса пользователя), затем проанализировать эти "инструкции", и базовая реализация выполнит эти инструкции на любом языке, на котором работает ваше приложение. написано в.

Краткий ответ: нет. То, что вы ищете, это DSL мечты парня HCI, который описал бы презентацию независимо от базовой технологии.

Вероятно, не совсем то, что вы хотели, вы можете посмотреть на GLSL. GLSL - это C-подобный язык, который компилируется драйвером графической карты в родной "язык графической сборки".

Другие вопросы по тегам