Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А вот шейдерную воду, огонь, отражения, свет и прочие радости я в самопальном движке не сделаю, тут вы правы на все 100%. Правда, игру с ними и не потяну, наверное, своими силами.Про то и речь. Использовался бы OpenGL 2.0+ — это все делалось бы на раз-два, и уж всяко на порядок проще, чем городить странные костыли, пытаясь выжать из 1.1 все, что возможно. Даже не вдаваясь в особо крутые эффекты — в том же хидденобжекте может понадобиться сделать спрайт, скажем, пульсирующим от полноцветного до оттенков серого (первое, что в голову пришло). На шейдерах это пара строк кода, с GL 1.1 — нереально, насколько я знаю.
это все делалось бы на раз-два, и уж всяко на порядок проще, чем городить странные костыли
в том же хидденобжекте может понадобиться сделать спрайт, скажем, пульсирующим от полноцветного до оттенков серого (первое, что в голову пришло)
float luminance = dot(vec3(0.2126,0.7152,0.0722), color);
color = mix(color, luminance, mix_amount);
Если камера перспективная, а не ортогональная, то это все же уже не совсем 2D графика.Перефразирую — под 2D игрой я имею в виду ту, где все спрайты находятся в одной плоскости. Какая при этом камера — дело десятое, если все равно все плоское и рисуется точно так же, как и при ортогональной камере.
Количество Draw Calls для glDrawTexfOES равно количеству используемых текстурПростите, откуда вы это взяли? Это не так. Биндинг текстуры это не то же самое, что и отрисовка. Документация говорит, что «glDrawTexOES draws a texture rectangle to the screen.», т.е. каждый вызов glDrawTexOES — это новая операция отрисовки, которая просто берет текущую текстуру и как-то ее рисует (вполне возможно, что через эмуляцию при помощью двух треугольников и все того же glDrawElements). Таким образом, для отрисовки 1000 одинаковых спрайтов вы 1 раз биндите текстуру и 1000 раз отрисовываете квад с этой текстурой. В случае с батчингом, как в нормальных движках — 1 раз биндите текстуру, 1 раз отрисовываете 1 объединенный меш. Это принципиальное различие влияет на производительность при большом количестве объектов не меньше, чем филлрейт.
Повторюсь, а зачем это в 2D играх того уровня, что может сделать команда в 1-3 человека за 3-6 месяцев?Для красоты, очевидно же. А какая вообще связь между фактом использования шейдеров и количеством людей в команде?.. Шейдеры при правильном применении как раз и позволяют сэкономить кучу времени и ресурсов.
будет этот спрайт блендиться с мигающей альфой поверх оригинального.А теперь представим, что этот спрайт рисуется во весь экран (или занимает большую его часть). Отрисовка обесцвеченного спрайта поверх обычного будет означать практически удвоение филлрейта. В шейдере же я мог бы забиндить две текстуры и сблендить их прямо в шейдере разом, тем самым не потеряв в филлрейте. Это банальный пример того, как использование шейдера позволяет увеличить производительность того же самого эффекта просто за счет большей гибкости. В 1.1 же действительно просто ничего не оставалось бы, кроме как рисовать два спрайта поверх друг друга.
под 2D игрой я имею в виду ту, где все спрайты находятся в одной плоскости. Какая при этом камера — дело десятое, если все равно все плоское и рисуется точно так же, как и при ортогональной камере.
Простите, откуда вы это взяли? Это не так. Биндинг текстуры это не то же самое, что и отрисовка.
Для красоты, очевидно же. А какая вообще связь между фактом использования шейдеров и количеством людей в команде?
А теперь представим, что этот спрайт рисуется во весь экран (или занимает большую его часть). Отрисовка обесцвеченного спрайта поверх обычного будет означать практически удвоение филлрейта. В шейдере же я мог бы забиндить две текстуры и сблендить их прямо в шейдере разом, тем самым не потеряв в филлрейте
ибо свою точку зрения высказал и аргументировал
Простите, это чушь.Очень аргументировано, действительно.
Взял из ранних презентаций, где говорилось и показывалось, как рисовать тысячи спрайтов в кадре этой функцией. Ищите, это было в сети на заре OpenGL ES 1.1Искал, не нашел никаких подтверждений. Зато нашел в сети упоминания, что на PowerVR (iOS + множество Android-девайсов) эта функция именно через эмуляцию и реализована, например. Аналогично вашему же примеру с OpenTK.
На счет красоты это вопрос вкуса, запрограммировать эффект такой же красивый, как может нарисовать хороший художник очень и очень сложно, а зачастую это займет еще и больше времени.Это вопрос не вкуса, это вопрос задачи, ибо обратное тоже справедливо — нарисовать эффект такой же красивый, который можно сделать очень быстро шейдером, может быть очень и очень сложно и долго, а зачастую и вообще невозможно.
Извините, неверно. Два texture fetch в шейдере вдвое уменьшат филрейтВы что-то очень сильно путаете. texture fetch в большинстве случаев никак не связан с филлрейтом. На то он и *fill* rate — этот параметр, грубо говоря, показывает, сколько раз в секунду GPU может полностью залить экран. Время выборки текселя тут вообще сбоку. В моем примере с шейдером происходит 2 выборки из текстуры и 1 рендеринг пикселя в backbuffer. В случае с рисованием двух спрайтов поверх друг друга — 2 выборки из текстуры, 2 рендеринга пикселя в backbuffer, т.е. филлрейт падает в 2 раза. Ситуаций, когда подобная оптимизация может зарулить — очень много, на самом деле. Мультитекстурирование тоже не просто так изобрели, хотя могли ведь 2 раза рисовать, проще же.
Судя по всему, вы сразу начали работать с шейдерными технологиями и считаете все, что было до них анахронизмом.Отнюдь. Я очень долго работал с GL 1.1, но как только появилась возможность использовать шейдеры — я перешел на них просто потому, что это удобнее и быстрее. Дело не в том, что я считаю GL 1.1 анахронизмом, я не понимаю другого — почему просто не использовать 2.0?.. Вот правда, я не вижу ни одного объективного критерия на сегодня, почему кто-либо может предпочесть 1.1. Если не нужны шейдеры — ну дык использовать по умолчанию примитивный шейдер, который рисует все «как есть». Зато появится возможность безболезненно использовать шейдеры, когда они будут нужны.
iOS, Android, BlackBerry, Windows XP/7, Mac OS X, Linux, ReactOS, Windows 8, Windows Phone 8.1почти полностью перекрывается Unity. А делать игру на Unity намного быстрее и удобнее, чем писать свой движок. И для 2d игр там в бесплатной версии есть практически все, что необходимо, даже GUI они наконец сделали приличный. И скриптовый язык основной там тоже C# (в то время как сам движок написан на C++).
пусть C# в связке с OpenGL пока нельзя использовать в вебе или на Firefox OSКстати да, чуть не забыл. Обратите внимание на проект JSIL. По сути, это транслятор IL-кода сборок .NET в JS, который работает в браузере. Конечно, сама по себе трансляция кода не даст совместимости с OpenGL, но под JSIL для простых игр уже довольно неплохо работает враппер MonoGame. Думаю, и враппер OpenGL <-> WebGL написать при большом желании можно. Во всяком случае это, наверное, самый простой путь портирования под браузеры для вашего случая.
OpenGL ES 1.1 в Windows 8 и Windows Phone 8.1