Современная область листов OpenGL в текстурном атласе (правильно в шейдере)
Я использую современный OpenGL для рендеринга 3D-сцены с текстурным атласом, который содержит все мои текстуры.
Расчет координат текстуры выполняется очень просто и загружается в VBO для шейдера. Вот некоторые основные вычисления в псевдокоде:
int posX = slot % texturesInAtlasX, posY = slot / texturesInAtlasX;
float startX = 1f / texturesInAtlasX * posX;
float startY = 1f / texturesInAtlasY * posY;
Обычно я использую это для вычисления 4 текстурных координат для прямоугольника, чтобы применить к нему часть атласа. Но сложность моей сцены вынуждает меня упростить мои сетки, вычисляя несколько граней с одинаковой текстурой в одно. Обычно это не имеет большого значения, потому что в OpenGL вы можете легко разбить вашу текстуру, подняв ваши координаты выше 1. Но так как я использую атлас текстуры, это не может быть легко сделано путем изменения способа вычисления координат текстуры.
Моя идея состояла в том, чтобы загрузить слот атласа, который должен использоваться, и размер лица в шейдер и каким-то образом отделить часть атласа от лица. Но я понятия не имею, как это сделать. Поскольку мои объекты по отдельности перемещаются по сцене, загрузка объектов в один VAO для текстуры или пакетирование объектов для текстур вместе - это не вариант, потому что это абсолютно снижает производительность.
Итак, мой вопрос: есть ли какая-либо особенность в OpenGL, которая может помочь мне разбивать плитки только на части текстуры?
1 ответ
Хорошо, после нескольких часов исследований я наконец нашел решение для своей проблемы. Функция, которую я нашел, называется "текстурными массивами" и является ядром начиная с OpenGL 3.3. Так что это безопасно для использования и не оказывает большого влияния на производительность. В моем случае это также дало мне значительное улучшение производительности. Это было также очень просто реализовать. Если кто-то сталкивался с подобной проблемой, вот ссылка, объясняющая, как работают массивы текстур: https://www.khronos.org/opengl/wiki/Array_Texture