Флейм
GameDev.ru / Флейм / Форум / Практика процедурного текстурирования (2 стр)

Практика процедурного текстурирования (2 стр)

Поделиться

Страницы: 1 2 3 4 ... 12 ... 21 22 23 Следующая

MikleМодераторwww5 сен. 201712:07#15
Татарин
> Если честно то никакого толку от процедурных текстур нету, 99.9% в реальный
> проект не перенести потому что сразу видно что текстура гамно, очень редкий
> случай когда она понадобится да и в итоге там 1 процедурная на 1000 не
> процедурных текстур - шкурка выделки не стоит.
Есть такой вполне себе успешный проект - Bryce, он основан на процедурных текстурах.
Но речь даже не об этом, для "местных" процедурные текстуры, звуки, модели и т. п. - это искусство, а не ремесло, получение от этого материальной выгоды не первостепенно, важнее удовольствие от процесса. Ты ещё выйди вечером во двор, где мужики в домино стучат, и объясняй им, что это занятие бесперспективно.
jaguardУчастникwww5 сен. 201712:30#16
gammaker

Сделай аналог shaderforge для опенгл/вебгл. То есть какой-то нодовый UI где можно без кода фильтровать картинку и потом генерить код шейдера для вставки в реальный проект.
Генерация там соответственно тоже может быть.

gammakerПостоялецwww5 сен. 201712:43#17
jaguard
> Сделай аналог shaderforge для опенгл/вебгл. То есть какой-то нодовый UI где
> можно без кода фильтровать картинку и потом генерить код шейдера для вставки в
> реальный проект.
> Генерация там соответственно тоже может быть.
Это конечно интересно, но одним лишь кодом шейдера редко можно обойтись. Иногда нужно много проходов, а значит понадобится управляющий код, который может быть C++, JS, скрипт какого-то движка, или словесный алгоритм. И реализовываться он может через OpenGL, DX, Vulkan, Metal или какой-то движок.
gammakerПостоялецwww5 сен. 201713:31#18
Что-то я не понял. В Хроме нет расширений вида *_color_buffer_float, зато есть OES_texture_float и OES_texture_float_linear. Значит ли это, что я не могу рендерить во float текстуру? Если так, то ничего нетривиального в Хроме сгенерить моя программа не сможет, по крайней мере без костылей, на разработку которых уйдёт время. Зато хотя бы в Firefox эти расширения есть.

Вот тут
https://developer.mozilla.org/en-US/docs/Web/API/OES_texture_float
написано:

This extension implicitly enables the WEBGL_color_buffer_float extension, which allows rendering to 32-bit floating-point color buffers.

Что значит "enables"? Работает ли это, если расширения WEBGL_color_buffer_float нет в списке?

Правка: 5 сен. 2017 13:58

jaguardУчастникwww5 сен. 201713:57#19
gammaker
>
> Это конечно интересно, но одним лишь кодом шейдера редко можно обойтись. Иногда
> нужно много проходов, а значит понадобится управляющий код, который может быть

Что за бред? Посмотри на shadertoy, там люди целые игры пишут на glsl. А уж многопроходная генерация - вообще как две мошонки к асфальту.
https://www.shadertoy.com/view/MddGzf

gammakerПостоялецwww5 сен. 201714:08#20
jaguard
> А уж многопроходная генерация - вообще как две мошонки к асфальту.
Если извратиться, то конечно можно что угодно сделать, но это будет очень-очень тормозно.
Например нужно сгенерировать некоторую текстуру, а потом размыть её. Тогда для размытия придётся сотни раз считать один и тот же промежуточный результат - для каждого пикселя текстуры считать всех соседей в радиусе размытия. Причём это размытие не получится разделить на горизонтальное + вертикальное, а значит вместо 2N операций понадобится N^2, где N - диаметр размытия в пикселях. А ещё при размытии по Гауссу с фиксированным радиусом существует оптимизация, основанная на использовании бесплатной линейной интерполяции при выборке из текстуры, которая позволяет сократить количество выборок в разы.
jaguardУчастникwww5 сен. 201714:35#21
gammaker
Ну будет твой гауссиан блюр работать не 5 мс, а 50, или 100 - тоже мне проблема для генератора, который не обязан работать в риалтайм. делаешь превьюшку 50х50, и через паузу при отсутствии ввода генерируешь полную версию.
gammakerПостоялецwww5 сен. 201714:38#22
Оказывается, уже почти год в хроме есть WebGL 2.0, и в контексте 2.0 поддерживается расширение EXT_color_buffer_float. Так что если в первом WebGL не заработает, попробую второй.

jaguard
> Ну будет твой гауссиан блюр работать не 5 мс, а 50, или 100 - тоже мне проблема
> для генератора, который не
В том-то и дело, что на сложных текстурах он будет работать не 5 мс, а 50000 мс, что даже для не реалтайма плохо. Даже такие превьюшки тормозить будут. Время необходимое для всех проходов будет не складываться, а умножаться, потому что нельзя ничего использовать повторно.

Правка: 5 сен. 2017 14:42

romgermanПостоялецwww5 сен. 201719:15#23
gammaker
> на сложных текстурах он будет работать не 5 мс, а 50000 мс
Это что за текстуры такие? 0_о
Субстанс дезигнер вон работает вроде, правда не в браузере
gammakerПостоялецwww5 сен. 201719:34#24
romgerman
> Это что за текстуры такие? 0_о
Ну например размытие шума Перлина. При многопроходном вычислении нужно 3 прохода:
1) Сгенерировать текстуру с шумом Перлина
2) Размыть по горизонтали
3) Размыть по вертикали
Перлин считается один раз на каждый пиксель, каждое размытие делает N выборок, равное диаметру размытия в пикселях. А с оптимизациями, использующими аппаратную линейную интерполяцию меньше. Не помню насколько, но наверное N/2.
Теперь объединяем первые два этапа в один проход и получаем, что на вычисление одного пикселя вместо N (или даже N/2) выборок из текстуры надо посчитать шум Перлина N раз! А если слить все три прохода в один, то N2 раз! А перлин это нетривиальная функция. Она занимает целый экран шейдерного кода и часто используют много его октав - штук 10-15. Если радиус размытия 16, тогда все октавы перлина надо будет посчитать 1024 раза на пиксель!

romgerman
> Субстанс дезигнер вон работает вроде, правда не в браузере
А он разве код шейдера выдаёт? Если да, то один шейдер всё делает за один проход?

*Lain*Забаненwww5 сен. 201720:02#25
Я хотел жёстко сбросить гейммейкеру, но пожалел его
gammakerПостоялецwww8 сен. 20170:09#26
Идеи из #10 почти реализованы. Уже есть два редактора, причём с подсветкой синтаксиса JS и GLSL и подсказками, есть мощная библиотека встроенных функций, включая перлин и ячеистый шум. И со всем этим уже можно делать многопроходные алгоритмы.
Поддерживаются все браузеры, какие у меня есть на ноуте: Chrome, Firefox, Opera, Edge, и даже IE11. Причём всё работает как в WebGL 1 режиме, так и в WebGL 2. Мои опасения по поводу того, что хром не поддерживает рендер во float текстуры не оправдались. В WebGL 1 расширения нет, но рендер работает. А в WebGL 2 расширение есть, и если его включить, то тоже работает.
Что ещё планируется сделать:
1) В случае ошибок выводить их вместо результирующих текстур, чтобы не надо было лезть в консоль разработчика.
2) Возможность задавать код через параметры в адресной строке и таким образом делать ссылки на редактор с открытым в нём примером. Сделать генерацию ссылки на текущее состояние прямо из программы, как в ideone. После этого этапа можно будет выложить, чтобы все могли экспериментировать и обмениваться результатами экспериментов.
3) Сделать не просто выплёвывание картинок сверху вниз, а генерацию миниатюр с возможностью их объединения по смыслу - например комплект из diffuse\normal\specular\ambient\albedo\roughness текстур. При нажатии на них, просмотр увеличенной версии, как в галерее.
4) Сделать возможность сохранять сгенерированные картинки на компьютер в разных форматах. В перспективе даже в BC1-BC5 DDS\KTX, чтобы можно было сразу загружать в любой движок без сжатия сторонней утилитой.
5) Сделать автоматическое выкидывание лишнего из шейдера. Сейчас компилируются все встроенные функции на 40 КБ кода GLSL, даже те, которые не используются. На Edge это очень тормозит компиляцию, в IE11 тоже заметно, а в Хроме довольно быстро, но наверное всё равно занимает большую часть времени генерации. Для быстрой генерации превьюшек и избавления от кнопки Генерировать эта оптимизация необходима.
6) Оставшийся пункт 6 из #10 - визуализация материала на объекте, который можно покрутить.

Пробовал сгенерировать три текстуры 8192x8192, одна из которых перлин, вторая простая, а третья - произведение двух первых. Всё вместе в хроме генерировалось всего лишь 10 секунд (это на встроенной HD Graphics 4600!), но отрисовываются полученные картинки в браузере очень медленно.

Правка:
7) Ещё сделать возможность загрузки готовых файлов текстур, чтобы все эффекты можно было применять к ним и использовать их для генерации. И тогда получится уже не только чистый генератор, но и редактор текстур. Конечно не визуальный, а кодом, но лично мне код больше нравится, чем соединять какие-то блоки и составлять из них запутанную сеть, в которой потом не разобраться.

Правка: 8 сен. 2017 0:24

FordPerfectПостоялецwww8 сен. 20171:30#27
gammaker
Мысли вслух:
1. Посмотреть как сделано у потенциального противника (filterforge) и позаимствовать идеи.
2. Непрерывное обновление, как в shadertoy. Отключаемое. Отключенное по умолчанию.
3. Константы, забайнденные на слайдеры. Чтоб я помнил, откуда я эту идею спёр (для https://jsfiddle.net/nak6h7jq/embedded/result/ ). У _Winnie, вроде, вычитал.
4. sRGB.
5. RGB <-> HSV <-> XYZ.
6. Возле текстуры можно выводить время генерации.
7. Альфа у тебя есть? Просмотр. Выбор подложки.
8. Хоткеи.
9. Перлин n-мерный? Есть произвольный Уорли (а не только 2D ячеистые)? Симплекс?
10. Генерация normal по heightmap?
11. Для ячеистых - как задаются центры? Poisson disk? Poisson distribution (с зерном, т. е. прямо в шейдере, не передавая точки извне), как у Уорли? Явно извне?
12. Blur? Как сделан?
13. Просмотр seamless.
gammakerПостоялецwww8 сен. 201710:38#28
FordPerfect
> 1. Посмотреть как сделано у потенциального противника (filterforge) и
> позаимствовать идеи.
Надо будет, но потом, когда свои идеи кончатся.

FordPerfect
> 2. Непрерывное обновление, как в shadertoy. Отключаемое. Отключенное по
> умолчанию.
Оно пока будет упираться во время компиляции шейдеров, надо будет пофиксить это. А ещё я не уверен, что браузер сможет обновлять картинки быстро. У меня же рисование не на одном canvas, а создаётся тег image для каждой экспортируемой текстуры.

FordPerfect
> 3. Константы, забайнденные на слайдеры. Чтоб я помнил, откуда я эту идею спёр
> (для https://jsfiddle.net/nak6h7jq/embedded/result/ ). У _Winnie, вроде,
> вычитал.
У меня пока нет поддержки uniform. Сейчас все параметры зашиваются прямо в код шейдера. И опять же не уверен, что картинки будут быстро обновляться при движении слайдера. WebGL текстура быстро сгенерируется, а вот остальная часть может тормозить: достать массив пикселей, сформировать blob bmp в памяти и скормить url в img.src. И надо разобраться, делать слайдеры для отдельных текстур или все вместе. Я пока склоняюсь к последнему варианту.

FordPerfect
> 4. sRGB.
Это можно самому делать в шейдере, возводя в степень 2.2 или 1/2.2.

FordPerfect
> 5. RGB <-> HSV <-> XYZ.
RGB <-> HSV есть в качестве GLSL функций RGBtoHSV и HSVtoRGB. XYZ по-моему тоже есть, только под другой аббревиатурой. Или это что-то другое. Я уже не помню - давно утащил в свой движок, а сейчас просто взял эти функции сюда.

FordPerfect
> 6. Возле текстуры можно выводить время генерации.
Я не уверен, что есть большой смысл в этом, потому что браузер выводит её на экран медленнее, чем генерует, а ещё шейдеры пока ещё долго компилируются. Но после всех оптимизаций можно будет сделать.

FordPerfect
> 7. Альфа у тебя есть? Просмотр. Выбор подложки.
Никакого выбора подложки нет, я всё-таки всего лишь 3 дня свою утилиту разрабатываю. Но bmp я генерирую 32-битный с альфой. Вроде читал, что некоторые браузеры её игнорируют. Пока не пробовал генерировать ничего прозрачного, не знаю, как будет выглядеть. Для полноценного просмотра со всеми наворотами наверное понадобится рендер WebGL, а значит это надо будет совместить в моём пункте 6.

FordPerfect
> 8. Хоткеи.
Пока особо нечего вешать на них. Я потом планирую задействовать табы. Один таб для кода, другой для просмотра результатов и экспорта, а третий для визуализации материала в 3D.

FordPerfect
> 9. Перлин n-мерный? Есть произвольный Уорли (а не только 2D ячеистые)?
> Симплекс?
2D и 3D, симплекс есть. В общем всё или почти всё, что я нашёл в интернете под названием webgl-noise.

FordPerfect
> 10. Генерация normal по heightmap?
Есть готовые шейдерные функции для этого.

FordPerfect
> 11. Для ячеистых - как задаются центры? Poisson disk? Poisson distribution (с
> зерном, т. е. прямо в шейдере, не передавая точки извне), как у Уорли? Явно
> извне?
Прямо в шейдере. Функция cellular, спёртая из webgl-noise.

FordPerfect
> 12. Blur? Как сделан?
Есть функции одномерного гауссовского размытия с фиксированным радиусом 4 или 8 пикселей. Так что нужно делать несколько проходов в управляющем JS коде. Переменный радиус в рамках webgl 1 реализовать не получилось и пока решил забить.

FordPerfect
> 13. Просмотр seamless.
В смысле затайлить текстуру, чтобы увидеть, есть ли швы? Это можно будет сделать в рамках моего пункта 6.

Спасибо за идеи, добавлю их в очередь для реализации. Как выполню свои первые 2 пункта из моего прошлого поста, выложу сюда. Только пока нет документации и подсказок не хватает, поэтому чтобы узнать какие есть функции, придётся смотреть исходники страницы.

FordPerfectПостоялецwww8 сен. 201716:59#29
gammaker
>Надо будет, но потом, когда свои идеи кончатся.
Некоторые идеи уровня дизайна, и их лучше представлять заранее.
>А ещё я не уверен, что браузер сможет обновлять картинки быстро.
Ну в shadertoy же работает. Худо-бедно.
>Это можно самому делать в шейдере, возводя в степень 2.2 или 1/2.2.
А можно выдать пользователю полноценную linear2srgb, как раз чтобы не городить кривое своё.
Я впрочем, скорее о промежуточных текстурах.
Для heightmap пользователю linear2srgb нафиг не нужен, но когда ты её отображаешь, можно подумать как именно. Как ты делаешь float->byte, если делаешь.
>Я не уверен, что есть большой смысл в этом, потому что браузер выводит её на экран медленнее, чем генерует, а ещё шейдеры пока ещё долго компилируются. Но после всех оптимизаций можно будет сделать.
Выводить индивидуально, возле каждой промежуточной текстуры, чтобы понятно, какой этап тормозит.
>Пока особо нечего вешать на них. Я потом планирую задействовать табы. Один таб для кода, другой для просмотра результатов и экспорта, а третий для визуализации материала в 3D.
Режим работы; рука вообще мышки не касается. Т. е. даже кнопка "Generate" с хоткеем или без - заметная разница.
>2D и 3D, симплекс есть. В общем всё или почти всё, что я нашёл в интернете под названием webgl-noise.
4D перлин иногда полезный (x,y,z,t)->текстурные координаты. Впрочем, 4D симплекс ок.
>Прямо в шейдере. Функция cellular, спёртая из webgl-noise.
Иногда ручками задавать тоже охота.
>Так что нужно делать несколько проходов в управляющем JS коде.
Так всё-равно дискретность, если гаусс только 4 или 8. Можешь взглянуть на extended box filter, и попробовать его адаптировать к своему.
https://fgiesen.wordpress.com/2012/07/30/fast-blurs-1/
https://fgiesen.wordpress.com/2012/08/01/fast-blurs-2/
>В смысле затайлить текстуру, чтобы увидеть, есть ли швы?
Да.

И да, FFT. Оно прикольное.

Успехов!

Страницы: 1 2 3 4 ... 12 ... 21 22 23 Следующая

/ Форум / Флейм / Программирование

2001—2017 © GameDev.ru — Разработка игр