Comments 7
Стоит добавить, что в libgdx все преобразования (поворот и прочее) реализует на шейдерах, включая работу с вьюпортом (вроде бы, не уверен), например. т.е. у каждого элемента уже присобачен внутри дефолтный шейдер, его стоит выдирать из ядра и дописывать, иначе поломается некоторая функциональность. Именно с этим и связаны зачастую ошибки, которые заставляют ставить pedantic = false поле.
Лично я поседел, пока не распотрошил все исходники libgdx и не понял почему у меня отваливается половина функционала при добавлении шейдера. Так что надеюсь эта информация будет для вас полезной.
Лично я поседел, пока не распотрошил все исходники libgdx и не понял почему у меня отваливается половина функционала при добавлении шейдера. Так что надеюсь эта информация будет для вас полезной.
+2
P.S. Немного промахнулся (запамятовал), не в спрайтах, а в батче, вот сами сырцы: github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/SpriteBatch.java#L127 Т.е. присобачивание нового убивает существующий и начинает творится всякая магия.
0
Вполне закономерно: в libgdx есть готовый шейдер для рисования спрайтов в батч-режиме. Для этого SpriteBatch передает в этот шейдер определенные параметры, если поменять шейдер, то эти параметры не поменяются. Так что если хочется использовать SpriteBatch, нужно свой кастомный шейдер писать таким образом, чтобы он поддерживал предопределенные SpriteBatch-ем параметры. Или не использовать его, а использовать шейдеры напрямую.
0
Мне кажется, тема недостаточно раскрыта.
Во-первых, использование batch при рисовании скрывает особенности того, как это всё работает. Для понимания происходящего было бы полезно вручную задать юниформы, атрибуты и вызвать функцию рисования.
Во-вторых, описание вершинного шейдера тоже не способствует понимаю. Я бы посоветовал новичкам написать gl_Position = a_position; и поиграться с разными значениями атрибутов, чтобы хорошо представлять, как это всё работает. (от -1 до 1 по x и y, при этом координаты однородные и на самом деле используются значения x/w, y/w).
В принципе, если кому-то нужно — могу написать небольшую статью.
Во-первых, использование batch при рисовании скрывает особенности того, как это всё работает. Для понимания происходящего было бы полезно вручную задать юниформы, атрибуты и вызвать функцию рисования.
Во-вторых, описание вершинного шейдера тоже не способствует понимаю. Я бы посоветовал новичкам написать gl_Position = a_position; и поиграться с разными значениями атрибутов, чтобы хорошо представлять, как это всё работает. (от -1 до 1 по x и y, при этом координаты однородные и на самом деле используются значения x/w, y/w).
В принципе, если кому-то нужно — могу написать небольшую статью.
+1
К слову о новичках в мире шейдеров, хоть и небольшой оффтоп, но мне очень сильно понравилась книга Коичи Мацуда в соавторстве с Роджером Ли: «WegGL: Программирование трёхмерной графики». Она по JS, но там для меня нашлось очень много полезной информации исключительно по шейдерам в мире OpenGL. Собственно по ней я и разбирался в шейдерах и устройстве libgdx (как бы это не комично звучало).
0
Лично мне, понравилась книга The book of shaders
0
Было бы интересно прочитать об этом более подробно.Я специально использовал batch, чтобы не передавать атрибуты для вершин вручную, по моему это только путает и пугает на начальном этапе.Насчет юниформ, согласен, надо было выбрать другой шейдер хотя-бы с одной юниформой, я как-то не подумал об этом.
0
Sign up to leave a comment.
Шейдеры в libgdx для чайников