Войти
ПрограммированиеФорумГрафика

Шейдеры в одном glsl файле

Страницы: 1 2 3 Следующая »
#0
13:14, 31 окт. 2020

Доброго времени суток.
Подскажите как использовать набор шейдеров в одном файле. Допустим мне необходимо для объекта использовать вершинный и фрагментный для простоты понимания. стандартно разбивается на два файла, тут все ясно. Но если записать оба шейдера в один файл допустим с расширением glsl. Как правильно его парсить в своей программе по синтаксису не используя в файле "левые" метки. Количество шейдеров можно определять по

 #version 
или
void main()
. А как определить тип шейдера?


#1
14:16, 31 окт. 2020

дефайнами разбей
http://jorgesanchez.me/notes/multiple-shaders-in-one-file/

#2
14:54, 31 окт. 2020

Посмотрел приведенный пример. На сколько такой подход по "феншую", предоставленая реализация с дефами проще чем с метками и при этом в рамках синтаксиса glsl. Взял на заметку. Ест ли еще методы или это оптимальный вариант без синтаксического анализа. Данный метод вполне подходит, хотел узнать альтернативы если есть. Благодарю за помощь. 

#3
(Правка: 18:57) 18:55, 31 окт. 2020

Вставь метки, например <vertex>, <fragment> и парси самостоятельно.
Кстати в hlsl эти извраты не нужны, там имя шейдера ты сам определяешь.

#4
(Правка: 3:58) 1:02, 1 ноя. 2020

signum7

Ест ли еще методы или это оптимальный вариант без синтаксического анализа.

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

Ещё проще:
файл\стрим состоит из множества кусков.
В начале каждого куска первые 4 байта - это длина куска, это же является указателем на следующий кусок. Тогда никакой мороки с адресами начала и не нужен заголовок.
Любой кусок можно безболезненно удалять, вся структура останется целостной.
Нужен кусок по индексу 5 - делаешь 4 прыжка.
Это легче, чем парсить, да и на порядки быстрее.

#5
7:24, 1 ноя. 2020

flint2
> В начале каждого куска первые 4 байта - это длина куска,
Вообще-то glsl это текстовый файл. Его руками правят, в текстовом редакторе. Какие куски, какая длина? Кто это будет вычислять после каждой правки?

Вот вам еще один вариант - можно использовать json формат. Тогда файл приобретет такой вид:
{
"Fragment" : " код фрагментного шейдера ",
"Vertex" : " код вертексного шейдера"
}
Парсеров Джейсона полно. Самому ничего писать не надо. 
Но по моему lookid дал самое простое решение.

#6
9:43, 1 ноя. 2020

signum7
> На сколько такой подход по "феншую",
он по феншую, все так делают

#7
(Правка: 16:36) 11:30, 1 ноя. 2020

san

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

А зачем это вообще вычислять??? Ведь мы-же художники программисты!
С текстом гораздо легче, впрочем и с бинарными данными всё нормально получается.
#8
12:30, 1 ноя. 2020

ТС сперва создал себе проблему, потом пытается её решить. О дивный мир. На компиляцию ты всё равно будешь отправлять сырой кусок текста конкретного шейдера, а как ты его хранишь абсолютно не важно, выбери какой угодно способ представлений, хоть в json или xml их засунь, если так уж сильно хочется усложнить себе жизнь.

#9
(Правка: 16:42) 14:21, 1 ноя. 2020

signum7 вот пример:
https://yadi.sk/d/p7zblCNFZn2kpA

Load file - загрузка файла скрипта в редактор.
Add txt - добавляет скрипт в файл со всеми скриптами scripts.glsl
Del ind - удаляет запись с индексом в окошке из scripts.glsl.
DataReplace - заменяет запись с индексом в окошке в scripts.glsl.
Load ind - загружает скрипт с индексом в окошке из scripts.glsl
Clear - чистит поле редактора.

Принципиальной разницы нет что пихать в поток.
Одна запись может быть музыкой, другая exe, третья картинкой, четвёртая текстом и всё это можно жать налету.
Времени не было, поэтому сделал только для текста и без сжатия.
Для примера накидал файлов всяко-разно - попробовать.

#10
(Правка: 20:33) 20:33, 1 ноя. 2020

flint2
Я тоже хотел что-то типа редактора для файлов запилить. но все руки не доходят Embarcadero red studio уже полгода не открывал ))
  Запись может быть музыкой, другая exe, третья картинкой хорошая вещь, хотелось бы увидеть реализацию.

#11
20:46, 1 ноя. 2020

Aroch
Та нет никакой проблемы, в одном файле все шейдеры удобнее чем несколько файлов согласись.

#12
21:37, 1 ноя. 2020

signum7

Я тоже хотел что-то типа редактора для файлов запилить. но все руки не доходят

Делай на SciLexer.dll - быстро и сердито.
Там есть подсветка синтаксиса, различные метки, folding, вставка комментариев отдельным окошком в любой строке... Всего и не перечислишь. Я себе так делал редактор для LUA скриптов со всеми прибамбасами. Но как бы отдельный редактор мало ценен, я вставлял туда встроенную консоль, дебагер, брекпоинты...
Могу завтра облагородить эту поделку, что выкладывал и вставить туда нормальный редактор - Scintilla. (делал наспех, делов по дому много было а за час ничего хорошего не сделаешь).
signum7
Запись может быть музыкой, другая exe, третья картинкой хорошая вещь, хотелось бы увидеть реализацию.

Завтра нарисую. + сжатие\распаковку налету.
Но у меня вопрос, что делать с данными, которые будут вытаскиваться из стрима?
Ведь их в текстовый редактор не засунешь и нельзя ассоциировать с программой.
Сделаю просто проигрывание звуков и вывод картинок на экран, exe`шники просто будут выполнятся, как программа.
Я так хранил набор семплов для юнитов.
#13
22:19, 1 ноя. 2020

flint2
Я сейчас 3d движок пишу, в том числе будет поддержка LUA (в данный момент lua занимаюсь). если будет сохранение ресурсов в каком то формате известном вам на этапе проектирования вашего приложения, не что не помешает внедрить прямую загрузку данных в движок "на лету" пока собственно движок проектируется. движок переваривает  такие данные как аудио, модели, колизии для физики, настройки. Модели в форматах obj для статических сцен (только мещь с текстурами). dae, 3ds все данные подераемые форматами.   

#14
23:03, 1 ноя. 2020

signum7

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

На каком языке мне делать С#, C++, Delphi,..., чтобы подстроится?
Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика