Лазарус, OpenGL и шейдеры
Модератор: Модераторы
Лазарус, OpenGL и шейдеры
Для работы с OpenGL использую OpenGLControl. А можно ли каким-то образом использовать шейдеры в Лазарусе?
Вызывает сомнение то, что шейдеры пишутся на C-подобном языке (разумеется скорее всего Лазарус его не поймёт), однако для чего тогда в модуле GLext (в функции function Load_GL_EXT_vertex_array: Boolean;) определены куча шейдерных констант и шейдерных функций.
Вызывает сомнение то, что шейдеры пишутся на C-подобном языке (разумеется скорее всего Лазарус его не поймёт), однако для чего тогда в модуле GLext (в функции function Load_GL_EXT_vertex_array: Boolean;) определены куча шейдерных констант и шейдерных функций.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
shyub писал(а):разумеется скорее всего Лазарус его не поймёт
ЯВУ содан только для удобства программирования. И лазарус, при желании, вполне может реализовать его поддержку.
shyub писал(а):однако для чего тогда в модуле GLext (в функции function Load_GL_EXT_vertex_array: Boolean;) определены куча шейдерных констант и шейдерных функций.
Потому что это реализация (драйвер) для OpenGl. Подключиться к нему можно из любого языка.
shyub писал(а):Вызывает сомнение то, что шейдеры пишутся на C-подобном языке
Шейдеры передаются напрямую в гпу в "исходном" тексте, так что придется смириться с тем, что этот язык похож на С: https://ru.wikipedia.org/wiki/Шейдер
Вызывает сомнение то, что шейдеры пишутся на C-подобном языке
И?..
Одним паскалем жив не будешь. Тут есть только один вариант действий: Git gud.
Согласен на все 100.Одним паскалем жив не будешь.
Однако, например мне удалось загрузить шейдер, но как им можно управлять из Лазаруса?
В моём понимании шейдер - это код, описывающий вид и поведение графического объекта, который загружается напрямую в GPU. Но как с ним взаимодействовать через Лазарус (мне надо, чтобы он изменял какие-то координаты вершин, цвет и т.п по командам программы, написанной на Лазарусе). Это я не могу понять.
На тему Лазарус-шейдер нашёл только это http://michellcomputing.co.uk/blog/2016/09/modern-opengl-with-lazarus/, чего явно недостаточно...
Добавлено спустя 3 минуты 6 секунд:
И лазарус, при желании, вполне может реализовать его поддержку.
Как? Какими механизмами?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Взаимодействие идет через вызовы функций OpenGl. Про работу этих функций вам надо искать в книжках по OpenGl, лазарь тут служит только как интерфейс к ним.
Или вам надо поставить библиотеку более высокого уровня, например
https://castle-engine.sourceforge.io/index.php
или
http://glscene.sourceforge.net/wikka/
или еще что-либо.
Или вам надо поставить библиотеку более высокого уровня, например
https://castle-engine.sourceforge.io/index.php
или
http://glscene.sourceforge.net/wikka/
или еще что-либо.
shyub писал(а):В моём понимании шейдер - это код, описывающий вид и поведение графического объекта
не совсем так, GPU это процессор, точнее очень много параллельных процессоров которые из первоначальных 2D/3D данных(точек, линий, треугольников.. цвета, текстур) рисуют 2D картинку экрана монитора.
Шейдеры помогают вмешаться в процесс.. заставить их по другому рисовать. перепрограммируют их.
shyub писал(а):Но как с ним взаимодействовать через Лазарус
Делаешь шейдер, объявляешь переменные в тексте программы, компилируешь, Opengl движок дает ID шейдера.. и когда приходит черед рисовать объект - применяешь ID шейдера.. записываешь данные в нужные для тебя переменные для шейдера, рисуешь объект.. все.. Так продолжается постоянно с новым циклом рисования и для всех объектов.
shyub писал(а):В моём понимании шейдер - это код, описывающий вид и поведение графического объекта, который загружается напрямую в GPU.
Это не совсем так. Рекомендую книгу "OpenGL суперкнига" авторы Ричард Райт-мл., Липчак 3-е издание там есть и классический и немного современный OpenGL, до OpenGL 3.3, если правильно помню. OpenGL 4 рассматривается в более поздних редакциях. 3-я версия точно есть в интернете как на английском, так и на русском языках.
-
MylnikovDm
- постоялец
- Сообщения: 103
- Зарегистрирован: 15.02.2007 20:26:10
- Откуда: Челябинск
Шейдер это программа для графического процессора, которая должна быть откомпилирована с помощью специального отдельного компилятора. С помощью функций, которые есть в OpenGL, вы только загружаете уже скомпилированный двоичный модуль в графический процессор и в нужный момент даёте команду его выполнить. Этот двоичный модуль может быть записан в виде отдельного файла на диске рядом с основной программой, либо прилинкован к исполняемому файлу программы как бинарный ресурс.
MylnikovDm писал(а):Шейдер это программа для графического процессора, которая должна быть откомпилирована с помощью специального отдельного компилятора. С помощью функций, которые есть в OpenGL, вы только загружаете уже скомпилированный двоичный модуль в графический процессор и в нужный момент даёте команду его выполнить. Этот двоичный модуль может быть записан в виде отдельного файла на диске рядом с основной программой, либо прилинкован к исполняемому файлу программы как бинарный ресурс.
Я давно подозревал, что С-подобные двоичные языки - мало отличны от бинарного кода. И эти, примитивные бинарные и
Добавлено спустя 33 часа 333 минуты 333 секунды:
shyub писал(а):Вызывает сомнение то, что шейдеры пишутся на C-подобном языке (разумеется скорее всего Лазарус его не поймёт)
Если бы только Лазарус не понимал эти ужасные С-подобные двоичные языки, то это было бы только половиной беды. Настоящая проблема в том что, даже программисты, с многолетним стажем - не могут понять эти чёртовы: двоичные С-подобные и бинарные С-подобные - языки.
shyub писал(а):А можно ли каким-то образом использовать шейдеры в Лазарусе?
Нет, шейдеры и Лазарус - несовместимы. Однако OpenGL как-то умеет отправлять эти примитивные С-подобные
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
vitaly_l писал(а):Нет, шейдеры и Лазарус - несовместимы.
Зачем путаешь...
TC явно не хватает теории, сходи например в https://habrahabr.ru/post/313380/, и делай тот же самый пример только не на си, а на паскале. В модуле gl или glext есть функции типа LoadOpenGL2_3 и подобные, которые выполнят за тебя всю необходимую работу по созданию нужного контекста OpenGL.
Всё там довольно просто. Пишешь текст шейдера, сохраняешь в файл или прямо в виде констант в программе. Загружаешь, компилируешь, когда надо использовать - подключаешь, задаешь входные данные через всякие glUniform функции или текстуры, рисуешь. Ну а шейдер уже на основании переданных входных данных рисует или так или эдак.
Всем спасибо. Начинаю потихоньку "въезжать" в тему.
Добавлено спустя 1 минуту 47 секунд:
А где можно найти каки-нибудь простые примеры по этой теме?
Добавлено спустя 1 минуту 47 секунд:
А где можно найти каки-нибудь простые примеры по этой теме?
MysticCoder писал(а):Зачем путаешь...
Лазарус не использует шейдеры, они ему просто ненужны, т.к. ему достаточно системных средств, для отрисовки интерфейса. Соответственно я-то как раз никого не путаю, а наоборот объясняю что: OpenGL, FPC, Pascal и Лазарус - это не одно и тоже.
MysticCoder писал(а):TC явно не хватает теории, сходи например в https://habrahabr.ru/post/313380/, и делай тот же самый пример только не на си, а на паскале.
Лучше поищите на этом форуме, полно готовых примеров на паскале. В частности, Скалогрыз делал 100% работающий пример.
-
Mirage
- энтузиаст
- Сообщения: 881
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
shyub: Тут важно понимать, что шейдеры работают с данными, загруженными в GPU программой (сами шейдеры это тоже такие данные). Непосредственно со структурами данных программы, которая эти шейдеры использует, они не работают и не имеют к ним доступа. Поэтому шейдерам все равно на чем написана программа. И тем более в каком IDE.
А я вот компилирую шейдеры с помощью вполне себе опенжеэлевской функции glCompileShader. Я что-то не так делаю?
А отдельный это в директиксе был и то вроде бы уже не.
MylnikovDm писал(а):Шейдер это программа для графического процессора, которая должна быть откомпилирована с помощью специального отдельного компилятора. С помощью функций, которые есть в OpenGL, вы только загружаете уже скомпилированный двоичный модуль в графический процессор и в нужный момент даёте команду его выполнить.
А я вот компилирую шейдеры с помощью вполне себе опенжеэлевской функции glCompileShader. Я что-то не так делаю?
А отдельный это в директиксе был и то вроде бы уже не.
-
MylnikovDm
- постоялец
- Сообщения: 103
- Зарегистрирован: 15.02.2007 20:26:10
- Откуда: Челябинск
А я вот компилирую шейдеры с помощью вполне себе опенжеэлевской функции glCompileShader. Я что-то не так делаю?
Вы правы, я не совсем точно выразился в своём комментарии. Компиляция шейдеров происходит непосредственно в процессе выполнения программы, поскольку компилятор шейдеров встроен в драйвер видеокарты. Иначе было бы невозможно обеспечить совместимость программ со всем множеством видеокарт, которые сегодня используются.
Я имел в виду сам исходный текст шейдера, который можно либо хранить в виде отдельных файлов, либо прилинковать непосредственно к исполняемому модулю и потом его грузить как ресурс. Многие игровые движки используют именно первый способ, за счёт чего программы шейдеров у них можно изменять без изменения бинарных файлов самой программы, чем часто пользуются при создании различных модов к играм.
Но, в любом случае, ни компилятор паскаля, ни компилятор С/С++ не обрабатывают программу шейдера. Для них она всего лишь набор текстовых строк, который необходимо скормить специальному компилятору.
