Есть куча вариантов. Некоторые, которые приходят на ум:
Изменить исходные активы
Вы можете перевернуть файлы изображений вверх ногами с помощью инструмента обработки изображений и использовать перевернутые изображения в качестве своих ресурсов. Они будут выглядеть перевернутыми при просмотре в средстве просмотра изображений, но затем окажутся правильными при использовании в качестве текстур.
Это идеальное решение, если вы полностью контролируете изображения. Очевидно, что это не сработает, если вы получаете изображения из внешних источников во время выполнения.
Перевернуть во время загрузки изображения
Некоторые библиотеки загрузки изображений позволяют переворачивать изображение во время загрузки. Из документации SOIL_image я смог найти, я не видел там эту опцию. Но вы можете найти альтернативную библиотеку, которая его поддерживает. И, конечно же, вы можете сделать это, если напишете собственную загрузку изображений.
Это хорошее решение. Накладные расходы минимальны, так как вы все равно выполняете перелистывание, когда касаетесь данных. Один из распространенных подходов заключается в том, что вы читаете данные построчно и сохраняете в текстуре в обратном порядке, используя glTexSubImage2D()
.
Переключение между загрузкой и первым использованием
Вы можете создать перевернутую копию текстуры после ее загрузки. Типичным способом сделать это было бы рисование четырехугольника размером с экран, сэмплирование исходной текстуры и рендеринг в FBO, который имеет результирующую перевернутую текстуру в качестве цели рендеринга. Или, что более элегантно, используйте glBlitFramebuffer()
.
Это не очень привлекательно, поскольку подразумевает копирование памяти. Хотя это должно быть довольно эффективно, если вы позволите графическому процессору создать копию, дополнительное копирование всегда нежелательно. Даже если это происходит только один раз для каждой текстуры, это может увеличить время запуска/загрузки.
Применение преобразования к координатам текстуры
Вы можете применить преобразование к координатам текстуры в вершинном или фрагментном шейдере. Вы говорите о поворотах в своем вопросе, но необходимое преобразование на самом деле тривиально. Вы просто сопоставляете y
координаты текстуры с 1.0 - y
и оставляете x
без изменений.
Это добавляет небольшую цену к выполнению шейдера. Но операция очень проста и быстра по сравнению с операцией выборки текстуры, с которой она связана. На самом деле дополнительные накладные расходы, вероятно, незначительны. Хотя я не думаю, что это очень красиво, это прекрасное решение.
Инвертировать координаты текстуры
Это похоже на предыдущий вариант, но вместо того, чтобы инвертировать координаты текстуры в шейдере, вы уже указываете их инвертированными в данных атрибута вершины.
Это часто тривиально сделать. Например, очень часто для текстурирования четырехугольников используются текстурные координаты (0, 0)
, (1, 0)
, (0, 1)
, (1, 1)
для 4 углов. Вместо этого вы просто заменяете 0
на 1
и 1
на 0
во вторых компонентах координат текстуры.
Или скажем, вы загружаете модель, содержащую координаты текстуры из файла. Вы просто заменяете каждое y
в координатах текстуры на 1.0f - y
во время чтения и перед сохранением координат текстуры для последующего рендеринга.
ИМХО, это часто лучшее решение. Это очень просто сделать и в основном не имеет штрафа за производительность.
person
Reto Koradi
schedule
27.06.2015