Современная область листов OpenGL в текстурном атласе (правильно в шейдере) - PullRequest
0 голосов
/ 26 ноября 2018

Я использую современный 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 Ответ

0 голосов
/ 26 ноября 2018

Хорошо, после нескольких часов исследований я наконец-то нашел решение своей проблемы.Функция, которую я нашел, называется «текстурными массивами» и является основной с OpenGL 3.3.Поэтому он безопасен в использовании и не оказывает большого влияния на производительность.В моем случае это также дало мне значительное улучшение производительности.Это было также очень просто реализовать.Если кто-то сталкивался с подобной проблемой, вот ссылка, объясняющая, как работают массивы текстур: https://www.khronos.org/opengl/wiki/Array_Texture

...