Как работает GlStateManager?

ReyMagos

Тег-бомбастер
413
7
131
Я вот делал недавно рендер для моба и подумал, а почему гл применяет изменения только для нужного мне элемента? Я же не указываю element.translate() или GlStateManager.translate(element). Указаний на элемент нет никаких. Может кто-то прояснить ситуацию?
 
GLStateManager это просто обёртка для функций lwjgl. translate это не функция применяемая к объекту - это своего рода состояние, где каждое последующее изменение матрицы применяется к предыдущему. Если мы напишем примерно так...
Java:
//Извиняюсь, код писал на коленке, синтаксис досконально не помню.
gltranslate(10.0f,20.0f,10.0f);
//Куб
...showCube();
//Сфера
...showSphere();
...то перемещение применится и к кубу и к сфере. Чтобы этого не произошло, должно быть что-то вроде этого:
Java:
glPushMatrix();
gltranslate(10.0f,20.0f,10.0f);
//Куб
...showCube();
glPopMatrix();
//Сфера
...showSphere();
Во втором примере переместится только куб, поскольку pushMatrix изменит текущую матрицу во время добавления в кадр куба, а popMatrix вернёт изначальную.
В случае с майнкрафтом эти функции частично автоматизированы.
 
Ага, вот как оно значит... тогда такой вопрос: матрица едина для всех объектов (блоков, ентити, частиц и т.д)?
1559691709_0_171_1736_1148_600x0_80_0_0_7557928f661f5f2e5dc0aa0cea77218e.jpg
 
Блоки, энтити, частицы - для рендера это всё набор вершин и параметров к ним. Матрица здесь - текущая система координат. Меняешь её = меняешь на экране всё. Чтобы изменять положение/поворот/размер конкретного объекта, нужно отделять объект от базовой системы координат. В майнкрафте это в большинстве случаев уже сделано... На самом деле моё утверждение не очень корректно, но в целом для понимания пойдёт...
-----------------
Но вообще, на форуме найдутся те, кто разбираются в этом больше, я с опенГЛ близко не общался, и доки читал только по мере необходимости. Если я ошибся - надеюсь меня поправят...
 
Нативные методы не бесплатные. Зачем вызывать, например, glBindTexture если состояние GL_TEXTURE_2D такое же, как в предыдущем вызове?
Очень заметно это для рендера шрифта, ибо там на каждый символ майн вызывает бинд текстуры. В итоге с этой обёрткой хоть для маленького слова, хоть для огромного текста будет вызван нативный бинд текстуры всего один раз вместо сотни.
GlStateManager - это просто кеш поверх OpenGl, чтобы лишний раз не дергать нативные методы когда состояние не изменялось. Тем самым не жечь зря процессорное время.
И да, вызывая нативные функции напрямую ты рискуешь словить кучу артефактов и багов. Потому что кеш думает что в нем лежит одно значение и ничего не меняет, а на самом деле в гл уже совсем другое. В новых версиях нужно юзать версии методов из стейта, если они там есть.
 
Указаний на элемент нет никаких
Семантика такая: все что будет нарисовано после - будет учитывать преобразования примененные до.
push/popMatrix позволяет задавать границы применения преобразований и момент, к которому состояние откатывается, работает по принципу стэка
 
Назад
Сверху