[Учебник]3D Рендер. Версия - 1.6.4.

2,955
12
Код:
GL11.glEnable(3042);
3024 - магическое число. Для замены таких чисел есть константы.
 
808
3
124
Боже мой, дайте я объясню нормально. Код тот же самый, только с более осмысленными комментариями и без магических чисел.
Код:
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(); // Возвращаемся к сохраненным трансформациям
}
 
2,955
12
А я хотел подождать расшифровку магического числа от анны.
 

svk

1,185
2
Не больше 1000 полигонов(
А как тогда в Метро2033 (Проект) делают такие модели? У них какой-то особенный загрузчик?
 
808
3
124
svk написал(а):
Не больше 1000 полигонов(
А как тогда в Метро2033 (Проект) делают такие модели? У них какой-то особенный загрузчик?
Глупости про 1000 полигонов, просто из-за кривизны форджевского рендера на сложных моделях сильно проседает FPS. У крогенита действительно особенный загрузчик, но не свой. Называется GLLoader. Там есть функционал для того, чтобы компилировать модель в display list и рендерить ее нормально. Сам GLLoader - знатный говнокод, так как делался вырезанием кода из какого-то левого приложения, но функционал у него намного больше, чем у форджевского загрузчика. Однако, я не рекомендую использовать GLLoader, если в моде много текстур. Он их грузит ОЧЕНЬ криво (да-да, даже хуже, чем майн), и на компах с малым количеством оперативки ее попросту не хватает.
Для загрузки каждой текстуры GLLoader создает буфер в отдельном разделе памяти, который не ограничен -Xmx и который фактически не очищается сборщиком мусора. Размер этого буфера равен размеру несжатой текстуры. Например, если ты грузишь 50 текстур 2048х2048, то тебе нужно 50 * 2048 * 2048 * 4 == 800 МБ дополнительной памяти. Если хочешь использовать GLLoader, то советую прикрутить к нему загрузку текстур хотя бы от ванильного майна (там хромает скорость загрузки, но памяти лишней не нужно).
 

svk

1,185
2
GloomyFolken написал(а):
svk написал(а):
Не больше 1000 полигонов(
А как тогда в Метро2033 (Проект) делают такие модели? У них какой-то особенный загрузчик?
Глупости про 1000 полигонов, просто из-за кривизны форджевского рендера на сложных моделях сильно проседает FPS. У крогенита действительно особенный загрузчик, но не свой. Называется GLLoader. Там есть функционал для того, чтобы компилировать модель в display list и рендерить ее нормально. Сам GLLoader - знатный говнокод, так как делался вырезанием кода из какого-то левого приложения, но функционал у него намного больше, чем у форджевского загрузчика. Однако, я не рекомендую использовать GLLoader, если в моде много текстур. Он их грузит ОЧЕНЬ криво (да-да, даже хуже, чем майн), и на компах с малым количеством оперативки ее попросту не хватает.
Для загрузки каждой текстуры GLLoader создает буфер в отдельном разделе памяти, который не ограничен -Xmx и который фактически не очищается сборщиком мусора. Размер этого буфера равен размеру несжатой текстуры. Например, если ты грузишь 50 текстур 2048х2048, то тебе нужно 50 * 2048 * 2048 * 4 == 800 МБ дополнительной памяти. Если хочешь использовать GLLoader, то советую прикрутить к нему загрузку текстур хотя бы от ванильного майна (там хромает скорость загрузки, но памяти лишней не нужно).
А как загрузить нормальную модель, а?)
 
808
3
124
Ну я "нормальные модели" гружу своим загрузчиком для своего формата :D
Если не хочется тратить кучу времени на разработку своего загрузчика, то есть два варианта:
1) Прикрутить использование dispay list'ов к загрузчику форджа. Плюсы такого решения: не надо париться с текстурами и степень отвратительности кода в итоге будет ниже. Минусы: нужно немного разобраться с openGL и нужно либо модифицировать фордж, либо копи-пастить оттуда код.
2) Прикрутить нормальную загрузку текстур к GLLoader'у. Плюсы: вероятно, это быстрее. Минусы: все-таки GLLoader - страшный говнокод, сорцы GLLoader'a надо еще найти.
 

svk

1,185
2
GloomyFolken написал(а):
Ну я "нормальные модели" гружу своим загрузчиком для своего формата :D
Если не хочется тратить кучу времени на разработку своего загрузчика, то есть два варианта:
1) Прикрутить использование dispay list'ов к загрузчику форджа. Плюсы такого решения: не надо париться с текстурами и степень отвратительности кода в итоге будет ниже. Минусы: нужно немного разобраться с openGL и нужно либо модифицировать фордж, либо копи-пастить оттуда код.
2) Прикрутить нормальную загрузку текстур к GLLoader'у. Плюсы: вероятно, это быстрее. Минусы: все-таки GLLoader - страшный говнокод, сорцы GLLoader'a надо еще найти.
Что хоть за dispay листы? Пытался найти в инете - не смог.
Я абсолютно не представляю с чего начать учить, как вообще работает эта загрузка текстур (Причём здесь текстуры?) и уж тем-более как это сделать : )
 
808
3
124
Оригинальная модель (6.5к треугольников и это совсем немного на самом деле)
h_1425655320_8494775_3083db2f8b.png


Пережатая до 1000 треугольников (заметь, не 300-500!)
h_1425655320_8312434_2dd64fb0da.png


Напоминаю, @svk пилит пушки. Все еще хочешь сказать "пережми"?
 
1,683
1
Ну потому что пушки это либо крутоймоднаовермрогапушик ,либо для сталкерокачественнркаловогомода. Просто можно вставить течн модель,высокого качества. В майнкрафте кубы как-то привычнее(ic2 все знают,и вовсе из-за высокого качества текстур/моделей). 
 P.S. самая качественную модель оружия которую видел,был автомат. 100k полигонов. Вот только зачем?
 

svk

1,185
2
Какую прогу для редактирования 3D моделей предложите?
Знаю ток 3Dmax или как-то так и блендер какой-то
 

svk

1,185
2
Ужс - рендер, сущий ад : )
[merge_posts_bbcode]Добавлено: 06.03.2015 21:31:56[/merge_posts_bbcode]

Так и не смог эту еб**ею развёртку привязать к предмету. (В блендере)
 
1,990
18
105
Смеетесь что ли. Если нормально организовать рендер и рисовать все не тысячей рендерколлов, а батчить, как нормальные люди, то 6к полигонов вообще будут ни о чём. 
У меня вон несколько десятков миллионов полигонов собственного криворукого производства видеокарта рисует на отличных фпс, и что? А у меня ноутбук с GF 710M и i3 на борту.
Даже 10к полигонов погоды не изменят, если у вас не все модельки сосредоточены в одной точке мира.
 
808
3
124
Oldestkon написал(а):
Смеетесь что ли. Если нормально организовать рендер и рисовать все не тысячей рендерколлов, а батчить, как нормальные люди, то 6к полигонов вообще будут ни о чём. 
У меня вон несколько десятков миллионов полигонов собственного криворукого производства видеокарта рисует на отличных фпс, и что? А у меня ноутбук с GF 710M и i3 на борту.
Даже 10к полигонов погоды не изменят, если у вас не все модельки сосредоточены в одной точке мира.
Кроме проблемы с большим количеством draw call'ов, есть еще одна: рендеринг в immediate-режиме (каждый кадр на видеокарту отправляется вся модель из памяти на видеокарту). Несмотря на то, что форджевский рендерер obj рендерит каждый меш в одном draw call'e, снижение производительности при большом количестве полигонов все равно очень заметно.
Излишнее число draw call'ов - это проблема для тех, кто использует течне-модели. Вне зависимости от того, как вы их храните (в .tcn или в коде), для течне моделей 1 шейп = 1 draw call. Даже obj лучше xD

Кстати, раз уж зашла речь об этом, то держите мой конвертер из .tcn в .obj: https://yadi.sk/d/YzJDj8EBcmHuA
Написан был на коленке для разовой задачи, так что никакого интерфейса нет. При запуске конвертирует все модели в папке, откуда запустили.
 

svk

1,185
2
Так поможете?
Подскажите как это сделать? С чего начать?

1) Прикрутить использование dispay list'ов к загрузчику форджа. Плюсы такого решения: не надо париться с текстурами и степень отвратительности кода в итоге будет ниже. Минусы: нужно немного разобраться с openGL и нужно либо модифицировать фордж, либо копи-пастить оттуда код.
 
808
3
124
svk написал(а):
Так поможете?
Подскажите как это сделать? С чего начать?

1) Прикрутить использование dispay list'ов к загрузчику форджа. Плюсы такого решения: не надо париться с текстурами и степень отвратительности кода в итоге будет ниже. Минусы: нужно немного разобраться с openGL и нужно либо модифицировать фордж, либо копи-пастить оттуда код.
Проще, наверное, скопипастить себе форджевский лоадер и заменить оригинальный на свою модификацию (AdvancedModelLoader.registerModelHandler()). Потом нужно прикрутить использование дисплей листов. Работать они должны как-то так:
1) При загрузке меша создается и компилируется дисплей лист, его айди записывается в объект меша
Код:
GL11.glGenLists(1);
GL11.glNewList(this.displayListId, GL11.GL_COMPILE);
this.render();
GL11.glEndList();
2) А в render() как-нибудь так:
Код:
if (this.displayListId == 0){
  //содержимое GroupObject.render()
} else {
  GL11.glCallList(this.displayListId);
}
3) Еще хорошо после загрузки всех мешей в модели было бы очищать списки вершина, нормалей, текстурных координат (в WavefrontObject) и фейсов (в GroupObject), потому что все это добро занимает немало оперативки и содержит кучу объектов, которые замедляют сборщик мусора.
 
Сверху