Шейдеры решают всё: Почему без GLSL ваш движок не выживет в WebGL
А вы что думали? Это так!😱
Всем привет! Как указано в заголовке, без этих маленьких программ (шейдеров) вы ничего не нарисуете в браузере! Оказалось, что в новых версиях и DirectX, и OpenGL тоже без них никуда. Я удивлён! Движки настолько скрыли от нас тонкости работы, что даже не подозреваешь, как это устроено. Да и многим этого не нужно.
Поэтому, если захотите писать свой движок/рендер, вам нужно обязательно изучать:
- Язык, на котором хотите разрабатывать движок.
- Язык GLSL для шейдеров.
И это не просто создание простых шейдеров. Через них в WebGL, например, принято отрисовывать спрайты: позиция, вращение, размер, текстура — всё это задаётся в шейдерах. Вы лишь передаёте значения, а все вычисления трансформаций происходят там же.
А теперь представьте: вы хотите применить эффект к спрайту через шейдер. Но за один раз к текстуре можно применить только одну шейдерную программу. Что делать?
- Вариант 1: Расширить базовый шейдер, чтобы помимо стандартных операций он применял и нужный эффект.
- Вариант 2: Сначала отрисовать все спрайты в текстуру, а затем применить эффект отдельной программой (здесь пригодится Framebuffer).
И всё это нужно учитывать!
Тут, конечно, снова восхищаешься большими движками — как они маскируют такую рутину от пользователя. Но зато становится понятно, почему их легко «сломать» или замедлить.
- 30 марта 2025, 10:53
Работая с 3d графикой сложно скрыться от шейдеров, поэтому всем советую)
Благо современные движки и программы для работы с графикой умеют в шейдерграфы, чтобы их не ручками писать, а собирать из нодов, впрочем особо сложные вещи все равно отдельными скриптами нужно имплементировать
Делая 3D игры в Godot на конкурс, я не почувствовал необходимости шейдеров как в эффектах перехода и виньетки. И тут, у тебя, это рассматривается как эффект (скорее всего). Меня же удивила, что это база/основа рендера с простыми операциями, как размещения, трансформация, отрисовка спрайта.
Я по этой же причине уже очень давно говорю, что ГеймМейкер это 3д движок. Потому что там тоже скрыты шейдеры, но можно и свои написать.
Нет)
Будем честны, у тебя в них использовались максимально простенькие материалы, там уже готовые шейдеры, в которые ты просто втыкаешь нужный цвет и текстуры. Если бы у тебя была задача сделать шейдер рисующий процедурный фрактал, то ты бы закопался в эту тему ранее)
Согласен. Если при разработке ты ставишь себе сам такую задачу, то ты её и делаешь. Но ты не обязан.
Это вопросы художественного виденья, если ты хочешь выйти за пределы стандартных материалов в движках, ты изучаешь шейдеры. Ты конечно не обязан выходить за пределы, но если хочешь что-то не стандартное, то придется
Я так с ОпенГЛ2 на ОпенГЛ3 переходил и возмущался, что даже для треугольника теперь нужен шейдер. Но в рамках совместимости там вроде оставили "простой" метод. А какой сейчас актуальный ОпенГЛ? 4? Уже полностью убрали старые методы рисования?
Я напрямую занимался OpenGL давно, ещё по урокам от Nehe (в переводе). Сейчас поисковик выдаёт, что последняя версия OpenGL 4.6. А без шейдеров не работает с версии 3.1.
О, я тоже его статьи смотрел, но не начинал с них. Вообще я начал с DirectX 7, кажется. Затем Dx9 и только потом openGL 2. Я был сильно удивлён насколько ОГЛ оказался проще в освоении. Но всё изменилось с 3+ версии, где шейдеры и всякое такое. Шейдеров я не боялся, меня напрягало, что приходилось делать кучу телодвижений для простейшей вещи (треугольника).
У меня, сначала Blitz3D, потом Flash, потом OpenGL. Затем решили с коллегами командой сделать игру, и по их убеждениям выбрали DirectX 9. Потом пошли игровые движки. Вот "вернулся" так сказать.
Блитц3д я тоже использовал! Это было в те периоды, когда я считал, что чем больше пишешь кода и меньше у тебя визуальных настроек, тем ты вообще круче и гамедев! В блице же был только редактор кода и всё.
Я уже забыл свой правдивый путь, всё смешалось: C++\DirectX7 на чужом движке, GameMaker6, DirectX9, Blitz3d, С+Opengl, GameMaker, хождение по движкам начиная с Unity, вернулся на GameMaker.
У меня была программа с Flash, но тогда я чёт совсем даже не смог понять что там игры можно программировать. А потом я увидел что можно писать код, но у меня не было ни одной зацепки как это делать. В какой период это было — я не помню.
Был и есть. Обновлялся в сентябре прошлого года. Ещё не поздно вернуться. :P
По Flash у меня тоже материала было мало, тогда ещё в Macromedia Flash. Так что баловался им больше для анимации/мультфильмов.
В настольном GL оставили. А вот в андроиде - либо только старый FFP (GLES1.0) либо только шейдеры (GLES2+). В WebGL - изначально только шейдеры.
Опять плодят кучу стандартов вместо того, чтобы резко рубануть или наоборот везде поддерживать?
рубанули и сделали вулкан. Там для вывода треугольника достаточно трехсот строк кода, кроме шейдеров надо еще и синхронизацию самому разруливать. Идея в том чтоб одиночки даже не пытались вникать и пользовались готовыми движками.
А нет просто фреймворков чисто для абстракции рендеринга на Вулкане? Обязательно именно движок?
то что я видел выглядит не сильно проще самого вулкана - сценграф, рендерпассы какие-то. Но если изучить то может всё там не так и сложно.
Идея в том, что работать с машиной состояний тяжело, да ещё и медленно :)
Vulkan :^)
Странный пост если честно.... В 2025 когда в любом движке сталкиваешься с тем, что как только надо добавить эффекты или анимацию небольшую без шейдеров никуда.
Правильно. Но разве для размещения спрайта (просто нарисовать картинку в указанных координатах) на экране нужно писать шейдер? Чтобы его повернуть, изменить размер нужен GLSL?
Я большинство 2D игр делал без написания своих шейдеров. Анимация покадровая, анимация координат, анимация полу-прозрачности, система частиц - куча всего. В Годоте ещё встроена анимация букв текста.
Скорее, к рендеру буфера вершин (наверное, в более современных API правильнее писать про рендер пайплайна?). Шейдер не применяется к текстуре, шейдер просто читает данные из текстуры (или из нескольких сразу), если это ему потребуется (можно и без текстуры 100% пикселей для меша генерировать в шейдере). Или имеется в виду текстура не как файл картинки, а как что-то, чем в итоге покрасили меш?
Пора переходить со своего движка обратно на чужой? :)
Тут конвейер, шейдер применяется либо к текстуре (указанную через sampler, WebGLTexture), либо к буферу (framebuffer, renderbuffer).
Нет. Меня всё устраивает и всё идёт вперёд. Наоборот, узнаёшь много интересного. Конечно, даже меняется подход/логика по работе с теми же шейдерами, но всё отлично. =)
Судя по видео, ползёт вперёд! ;)
Пониманию, что картинка не впечатляет. Но за кулисами это классы: ECS, обработки ввода с действиями, менеджер шейдеров, менеджер Framebuffer, Canvas, WebGL, Tween, класс по работе с текстурными атласами, ресурсами. Теперь из всех инструментах собирается пазл для конкретной игры.
Сюда бы Боброва... Интересно, что он сказал бы по поводу шейдеров.
Если не ошибаюсь, он занимается софтрендером (без использования GPU). Это определённая ниша. А что тут скажешь? Разными, параллельными направлениями идём. Большинство придерживаются использования GPU для ускорения, пытаются вот развивать WebGPU (но ещё рано для него).
Ну вот поэтому и сказал бы.