Итак, как же запилить модель с картой нормалей.
===
Для начала нужно создать где-то объект VBO, 2 текстуры(текстуру и карту нормалей), модель. Создать их нужно в контексте рендеринга, т.е. в потоке рендера(подойдут эвенты с приставкой Render-). И да, VBO/текстуры надо создавать по разу, зачем плодить кучу? Я не придумал ничего лучше использования ленивой инициализации, т.е. if(a == null) {a = X}; code; В Скале и Котлине есть свой функционал(делегат в Котлине, ключ. слово lazy в Скале) .
===
ВБО создать ты можешь либо сам, либо загрузить obj. Если сам, то тебе в VBO.createModel. Тут укажешь вершины(просто вершины), индексы(треугольники, они всюду. Ты должен вручную указать порядок индексов для треугольника. 0 - первый индекс из 1 аргумента метода. useNormals поставишь тру, если хочешь нормал маппинг(от 2-х убогих источников. Подробнее о них в шредоре)). Загрузить модель попроще, пишешь loadModel, первый аргумент - указываешь объект ObjLoader , второй - путь.
===
От текстуры лишь нужен textureId, текстуру загрузить в память. В общем, дабы не переписывать функционал, используй SimpleTexture. Укажешь ResourceLocation, достанешь glTextureId. Для карты нормалей то же самое, это тоже текстура.
===
Когда создашь всё, запиши в какие-нибудь статические переменные. Затем надо вызвать VBO.renderWithNormalMap(model, normaltextureId, textureId). Также тебе будет нужна матрица. По умолчанию используется proj * view, т.е. модель будет где-то над головой у игрока. Если хочешь передвинуть, то нужно создать proj * view * model. Вообще, есть более удобный метод(не знаю, может и не удобный) makeMVPMatrix в ClientUtils. Укажешь позицию в виде вектора, вращение и масштабирование. Можешь поставить faceToCamera на тру, тогда это будет биллбоард. Вооот.
===
Пихаешь данные в метод, он рисует.
===
Вроде, всё. Легче было бы кодом, но мне лень скачивать эту либу, сорре. И да, если чего-то не понял, то уж прости, писать внятно я не очень умею.