- 2,955
- 12
Код:
GL11.glEnable(3042);
GL11.glEnable(3042);
public void renderItem(ItemRenderType type, ItemStack is, Object ... data) {
// Сохраняет матрицу с текущими переносами-поворотами-масштабированиями. После применения GL11.glPopMatrix() мы вернемся к сохраненной матрице.
GL11.glPushMatrix();
// Включаем смешивание цветов (полупрозрачность). Снижает производительность, так что в 95% случаев это писать не надо.
GL11.glEnable(GL11.GL_BLEND);
// Задает режим смешивания. Про режимы смешивания можно написать целую статью, но это - самый используемый режим, который включает "обычную" полупрозрачность.
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
// Нифига не поворот, а очень даже перенос. Три числа здесь - насколько вдоль какой оси переносить. Следует понимать, что результат переноса зависит от предыдущих примененных трансформаций.
GL11.glTranslatef(-0.6F, 1.3F, 0.5F);
// А вот это уже поворот. 135 - правда градусы, а следующие три числа задают ось, вокруг которой будет происходить поворот. В этом примере поворот будет вокруг вертикальной оси. Однако, результат поворота тоже зависит от предыдущих трансформаций.
GL11.glRotatef(135.0F, 0.0F, 1.0F, 0.0F);
// Третий вид трансформации - масштабирование. Три числа задают то, насколько модель растянется относительно каждой из осей, в этом примере модель увеличится в три раза. В 99% случаев для масштабирования нужно использовать одно и то же число для каждой из осей, иначе модель сплющивается/растягивается.
GL11.glScalef(3.0F, 3.0F, 3.0F);
// Устанавливаем текстуру. Все, что мы нарисуем с этого момента и до следующей смены текстуры, будет отрисовано с этой текстурой.
Minecraft.getMinecraft().renderEngine.bindTexture(tex);
model.renderAll(); // Собственно отрисовываем модель
GL11.glDisable(GL11.GL_BLEND); // Выключаем смешивание
GL11.glPopMatrix(); // Возвращаемся к сохраненным трансформациям
}
Глупости про 1000 полигонов, просто из-за кривизны форджевского рендера на сложных моделях сильно проседает FPS. У крогенита действительно особенный загрузчик, но не свой. Называется GLLoader. Там есть функционал для того, чтобы компилировать модель в display list и рендерить ее нормально. Сам GLLoader - знатный говнокод, так как делался вырезанием кода из какого-то левого приложения, но функционал у него намного больше, чем у форджевского загрузчика. Однако, я не рекомендую использовать GLLoader, если в моде много текстур. Он их грузит ОЧЕНЬ криво (да-да, даже хуже, чем майн), и на компах с малым количеством оперативки ее попросту не хватает.svk написал(а):Не больше 1000 полигонов(
А как тогда в Метро2033 (Проект) делают такие модели? У них какой-то особенный загрузчик?
А как загрузить нормальную модель, а?)GloomyFolken написал(а):Глупости про 1000 полигонов, просто из-за кривизны форджевского рендера на сложных моделях сильно проседает FPS. У крогенита действительно особенный загрузчик, но не свой. Называется GLLoader. Там есть функционал для того, чтобы компилировать модель в display list и рендерить ее нормально. Сам GLLoader - знатный говнокод, так как делался вырезанием кода из какого-то левого приложения, но функционал у него намного больше, чем у форджевского загрузчика. Однако, я не рекомендую использовать GLLoader, если в моде много текстур. Он их грузит ОЧЕНЬ криво (да-да, даже хуже, чем майн), и на компах с малым количеством оперативки ее попросту не хватает.svk написал(а):Не больше 1000 полигонов(
А как тогда в Метро2033 (Проект) делают такие модели? У них какой-то особенный загрузчик?
Для загрузки каждой текстуры GLLoader создает буфер в отдельном разделе памяти, который не ограничен -Xmx и который фактически не очищается сборщиком мусора. Размер этого буфера равен размеру несжатой текстуры. Например, если ты грузишь 50 текстур 2048х2048, то тебе нужно 50 * 2048 * 2048 * 4 == 800 МБ дополнительной памяти. Если хочешь использовать GLLoader, то советую прикрутить к нему загрузку текстур хотя бы от ванильного майна (там хромает скорость загрузки, но памяти лишней не нужно).
Что хоть за dispay листы? Пытался найти в инете - не смог.GloomyFolken написал(а):Ну я "нормальные модели" гружу своим загрузчиком для своего формата
Если не хочется тратить кучу времени на разработку своего загрузчика, то есть два варианта:
1) Прикрутить использование dispay list'ов к загрузчику форджа. Плюсы такого решения: не надо париться с текстурами и степень отвратительности кода в итоге будет ниже. Минусы: нужно немного разобраться с openGL и нужно либо модифицировать фордж, либо копи-пастить оттуда код.
2) Прикрутить нормальную загрузку текстур к GLLoader'у. Плюсы: вероятно, это быстрее. Минусы: все-таки GLLoader - страшный говнокод, сорцы GLLoader'a надо еще найти.
Могу помочь, пиши в ЛС ошибкуsvk написал(а):Ужс - рендер, сущий ад : )
[merge_posts_bbcode]Добавлено: 06.03.2015 21:31:56[/merge_posts_bbcode]
Так и не смог эту еб**ею развёртку привязать к предмету. (В блендере)
Кроме проблемы с большим количеством draw call'ов, есть еще одна: рендеринг в immediate-режиме (каждый кадр на видеокарту отправляется вся модель из памяти на видеокарту). Несмотря на то, что форджевский рендерер obj рендерит каждый меш в одном draw call'e, снижение производительности при большом количестве полигонов все равно очень заметно.Oldestkon написал(а):Смеетесь что ли. Если нормально организовать рендер и рисовать все не тысячей рендерколлов, а батчить, как нормальные люди, то 6к полигонов вообще будут ни о чём.
У меня вон несколько десятков миллионов полигонов собственного криворукого производства видеокарта рисует на отличных фпс, и что? А у меня ноутбук с GF 710M и i3 на борту.
Даже 10к полигонов погоды не изменят, если у вас не все модельки сосредоточены в одной точке мира.
1) Прикрутить использование dispay list'ов к загрузчику форджа. Плюсы такого решения: не надо париться с текстурами и степень отвратительности кода в итоге будет ниже. Минусы: нужно немного разобраться с openGL и нужно либо модифицировать фордж, либо копи-пастить оттуда код.
Проще, наверное, скопипастить себе форджевский лоадер и заменить оригинальный на свою модификацию (AdvancedModelLoader.registerModelHandler()). Потом нужно прикрутить использование дисплей листов. Работать они должны как-то так:svk написал(а):Так поможете?
Подскажите как это сделать? С чего начать?
1) Прикрутить использование dispay list'ов к загрузчику форджа. Плюсы такого решения: не надо париться с текстурами и степень отвратительности кода в итоге будет ниже. Минусы: нужно немного разобраться с openGL и нужно либо модифицировать фордж, либо копи-пастить оттуда код.
GL11.glGenLists(1);
GL11.glNewList(this.displayListId, GL11.GL_COMPILE);
this.render();
GL11.glEndList();
if (this.displayListId == 0){
//содержимое GroupObject.render()
} else {
GL11.glCallList(this.displayListId);
}