Шейдеры решают всё: Почему без GLSL ваш движок не выживет в WebGL
А вы что думали? Это так!😱
Всем привет! Как указано в заголовке, без этих маленьких программ (шейдеров) вы ничего не нарисуете в браузере! Оказалось, что в новых версиях и DirectX, и OpenGL тоже без них никуда. Я удивлён! Движки настолько скрыли от нас тонкости работы, что даже не подозреваешь, как это устроено. Да и многим этого не нужно.
Поэтому, если захотите писать свой движок/рендер, вам нужно обязательно изучать:
- Язык, на котором хотите разрабатывать движок.
- Язык GLSL для шейдеров.
И это не просто создание простых шейдеров. Через них в WebGL, например, принято отрисовывать спрайты: позиция, вращение, размер, текстура — всё это задаётся в шейдерах. Вы лишь передаёте значения, а все вычисления трансформаций происходят там же.
А теперь представьте: вы хотите применить эффект к спрайту через шейдер. Но за один раз к текстуре можно применить только одну шейдерную программу. Что делать?
- Вариант 1: Расширить базовый шейдер, чтобы помимо стандартных операций он применял и нужный эффект.
- Вариант 2: Сначала отрисовать все спрайты в текстуру, а затем применить эффект отдельной программой (здесь пригодится Framebuffer).
И всё это нужно учитывать!
Тут, конечно, снова восхищаешься большими движками — как они маскируют такую рутину от пользователя. Но зато становится понятно, почему их легко «сломать» или замедлить.
- 30 марта 2025, 10:53
Я так с ОпенГЛ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 :^)