Эмулируйте большие текстуры NPOT для старых графических процессоров - PullRequest
1 голос
/ 03 декабря 2009

В моей 2D игре мне нужны текстуры, которые могут быть сколь угодно большими, могут быть NPOT и не квадратными. Они только когда-либо отображаются на один вид примитива: прямоугольники через GL_QUADS (четыре угла QUAD отображаются на четыре угла текстуры). Иногда матрица текстуры масштабируется перед рисованием.

Я хочу, чтобы моя игра работала везде, даже на старых / дешевых видеокартах, которые допускают только небольшие и / или POT-текстуры. Какое решение я должен использовать? Стоит ...

  • Простота реализации
  • Очень хорошая производительность.

В настоящее время мне известны следующие опции:

  • Используйте расширение , как GL_TEXTURE_RECTANGLE_{EXT,NV,ARB}, чтобы NPOT работал на картах, которые не поддерживают собственные текстуры NPOT OGL2.0.

    • это не решает проблему "большой текстуры".
    • работает ли оно на максимальном количестве ПК? видеокарты, которые поддерживают OGL2.0 NPOT, также поддерживают эти расширения?
    • Какой из трех вариантов EXT / NV / ARB использовать?
  • Реализуйте BigTextures в виде набора маленьких кусочков текстуры POT, которые тщательно рисуются на нескольких смежных квадроциклах. Это обеспечивает "большие текстуры" и NPOT, но это немного сложно и ограничивает.

  • Реализуйте мои текстуры NPOT как текстуры POT, дополненные прозрачностью справа и снизу. Это приведет к потере памяти и затруднит разбиение текстур, и это не решит проблему «больших текстур».
  • Используйте готовый раствор.

Примером проблемной видеокарты является набор микросхем Intel® 945GM Express для мобильных ПК , который, похоже, не поддерживает встроенный NPOT.

Обновление : В итоге я выбрал третий вариант. Круто, я смог использовать glTexSubImage2D, а не заполнять текстуру вручную. Это безумно быстро. Да, он не обеспечивает поддержку «больших текстур», но я понял, что мои целевые графические процессоры поддерживают до 2048x2048, что достаточно для меня. Да, и GL_TEXTURE_RECTANGLE_EXT даже не поддерживается на мобильных чипсетах Intel® 945GM Express .

Ответы [ 4 ]

2 голосов
/ 03 декабря 2009

Если все ваши UV-координаты находятся в диапазоне [0, 1], вы можете упаковать свои текстуры NPOT в текстурный атлас .

Поскольку ваши текстуры могут быть сколь угодно большими, я, вероятно, согласился бы с предложением разделить текстуры NPOT (и соответствующие квадраты) на части POT, не больше, чем может обработать аппаратное обеспечение. Если вы выбрали это решение, не забудьте установить режим обтекания на GL_CLAMP_TO_EDGE, чтобы минимизировать артефакты рендеринга на краю (если вам нужно минифицировать, вы все равно получите некоторые).

Если карта не поддерживает текстуры OpenGL 2.0 NPOT, маловероятно, что они будут поддерживать GL_TEXTURE_RECTANGLE_{EXT,NV,ARB}.

0 голосов
/ 06 декабря 2009

Что касается этих расширений NPOT, то по памяти они все очень похожи и просто указывают на то, что обычные ограничения для текстур Power of Two не применяются. Вы можете посмотреть их в реестре расширений OpenGL

Из памяти три расширения на самом деле ОДНО ОДНОВРЕМЕННОЕ расширение, оно было представлено NVidia как GL_ NV_ texture_ non_ power_ of_ two, прежде чем оно было принято Советом по рассмотрению архитектуры (это GL_ ARB_ texture_ non_ power_ of_ два ). Он был бы GL_ EXT_ texture_ non_ power_ of_ two, как только он был принят в OpenGL 2.0. Я могу ошибаться в некоторых из этих деталей, но у вас есть жизненный цикл нового расширения OpenGL.

Вы можете свободно проверять наличие этих расширений и использовать их там, где они есть. Может быть несколько карт до OpenGL2.0, которые поддерживают его, но не так много, поэтому вам потребуется дополнительная стратегия резервного копирования.

На ум приходят два варианта.

  • Для неповторяющейся текстуры просто очистите лишнее пространство и убедитесь, что вы установили координаты текстуры, чтобы они не отображались.
  • Растяните текстуру, чтобы она была степенью двойки.
0 голосов
/ 03 декабря 2009

Как правило, я бы предпочел сделать все ваши текстуры POT. Это быстрее, и вам не нужно беспокоиться о совместимости. Помните, что размер текстуры не обязательно должен иметь соотношение 1: 1 к отображаемому размеру - вы можете растянуть текстуру NPOT до размера POT в редакторе изображений и просто отобразить ее в правильном размере. Текстурные атласы также хороши; они уменьшают количество переключений текстур, которое вы делаете, что может быть довольно медленным.

Для больших текстур у вас есть только возможность разделить их на более мелкие текстуры. Это строгое аппаратное ограничение, и поэтому вам необходимо приложить некоторые усилия для разделения текстур (на лету или заранее).

0 голосов
/ 03 декабря 2009

Ну, вам лучше использовать запасные варианты для каждого уровня.

Если ваша карта поддерживает большие текстуры, но только POT, вы можете просто выделить текстуру следующей степени 2 и выше. т.е. для текстуры 1024x768 выделите 1024x1024 и растяните ее до полного размера текстуры. Это будет красиво, и вы не должны заметить искажения от операции растяжения.

Если ваша карта не может делать большие текстуры, у вас проблема. Единственное реальное решение - разделить треугольники и использовать множество текстур меньшего размера. Как вы говорите, это не самое лучшее решение, потому что это очень интенсивно. На самом деле на оборудовании, которое не поддерживает такие текстуры, вы можете обнаружить, что дополнительная загрузка вершин также снижает производительность. В таком случае вам, возможно, придется просто уменьшить масштаб текстур до версии с более низкой детализацией. Это не лучшее решение, но это может быть вашим единственным выбором. Ваш единственный вариант - не поддерживать такие карты ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...