Почему текстуры всегда имеют квадратную силу в два? Что, если это не так?

Почему разрешение текстур в играх всегда имеет силу двух (128x128, 256x256, 512x512, 1024x1024 и т. д.)? Не было бы разумно сохранить размер файла игры и сделать текстуру точно подходящей для модели, развернутой УФ?

Что произойдет, если будет текстура, которая не может быть двух?

Неправильно ли иметь текстуру что-то вроде 256x512 или 512x1024? Или это может вызвать проблемы, которые могут возникнуть из-за отсутствия текстур?

51 голос | спросил Keavon 26 MaramMon, 26 Mar 2012 04:52:58 +04002012-03-26T04:52:58+04:0004 2012, 04:52:58

7 ответов


46
  

Почему разрешение текстур в играх всегда имеет силу двух   (128x128, 256x256, 512x512, 1024x1024 и т. Д.)?

Как подразумевает Byte56, ограничения «мощности двух» размеров являются (были), что каждое измерение должно быть независимо от силы двух, а не то, что текстуры должны быть квадратными и иметь размеры, которые мощность двух.

Однако, на современных картах и ​​в современных графических API это «ограничение» значительно смягчилось, так что размеры текстур могут быть в разумных пределах практически любыми, что вам нравится. Однако:

  

Не было бы разумно сохранить размер файла игры и сделать   текстура точно соответствует УФ-развернутой модели? Что произойдет, если   была текстурой, которая не была силой двух?

Благодаря тому, что размеры текстур имеют мощность в два, графический конвейер может использовать преимущества оптимизации, связанные с эффективностью при работе с полномочиями двух. Например, это может быть (и абсолютно прошло несколько лет назад, прежде чем мы выделили графические процессоры и чрезвычайно умные оптимизаторы компиляторов) быстрее разделить и умножить на два. Работа в силах двух упрощенных операций внутри конвейера, таких как вычисление и использование mipmaps (число, которое является силой двух, будет всегда разделяться равномерно пополам, а это означает, что вам не нужно иметь дело со сценариями, в которых вы должны округлить ваши размеры mipmap вверх или вниз).

Это правда, что вы «тратите» некоторое пространство таким образом, но дополнительное пространство обычно стоит того, чтобы компенсировать рентабельность рендеринга. Кроме того, существуют такие методы, как сжатие или упаковка нескольких изображений в единое пространство текстур, которое может облегчить некоторые из отходов хранения.

ответил Josh Petrie 26 MaramMon, 26 Mar 2012 05:08:37 +04002012-03-26T05:08:37+04:0005 2012, 05:08:37
17
  

Почему текстуры всегда имеют квадратную силу двух?

Текстуры не всегда квадрат , а также всегда полномочия двух . Причина, по которой они имеют тенденцию быть , равными двум, обычно увеличивает совместимость со старыми видеокартами, налагающими это ограничение. Что касается не квадратных текстур, это обычно не проблема. Подводя итог:

  • Текстуры обычно не должны быть квадратными , хотя DirectX имеет возможность D3DPTEXTURECAPS_SQUAREONLY, но я работал с не квадратными текстурами даже в более старом оборудовании без проблем .
  • Текстуры должны быть полномочий двух , потому что многие старые графические карты все еще требуют этого. Причина этого ограничения заключалась в том, что они могли выполнять некоторые оптимизации для операций картирования текстур. Большинство современных графических карт также не имеют этого ограничения.
ответил David Gouveia 26 MaramMon, 26 Mar 2012 05:09:57 +04002012-03-26T05:09:57+04:0005 2012, 05:09:57
6

Это относится к оптимизации видеокарты. Они были разработаны таким образом, чтобы обрабатывать их. В настоящее время большинство карт позволяют загружать текстуры с размерами, не равными двум, но, скорее всего, это негативно скажется на производительности. Существует хорошая вероятность того, что когда он загрузится, на самом деле он будет конвертирован в стоимость загрузки и не будет сохранять память. Неквадратичные текстуры, как правило, в порядке, если оба их размера равны двум.

Один из способов работы с текстурами нечетного размера - использовать Атлас текстуры . В принципе, вы помещаете несколько текстур вместе в одну текстуру и используете координаты текстуры ваших вершин для ссылки на конкретное изображение, которое вам нужно. Это связано с дополнительными преимуществами производительности, поскольку это позволяет избежать изменений состояния. Общим применением этого является включение всех элементов интерфейса в единую текстуру, что означает, что если вы собрали вершины ваших интерфейсов в один буферный объект, вы можете сделать все это одним вызовом, а не переключать текстуры много раз и сделать отдельный призыв к призыву для каждого.

ответил Jason Morales 26 MaramMon, 26 Mar 2012 05:07:09 +04002012-03-26T05:07:09+04:0005 2012, 05:07:09
6

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

Например, посмотрите внизу http : //msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx и читать сноски 3 и 4.

  

3 На уровнях признаков 9_1, 9_2 и 9_3 устройство отображения поддерживает использование 2-D текстур с размерами, которые не являются степенями двух в двух условиях. Во-первых, может быть создан только один уровень MIP-карты для каждой текстуры, а во-вторых, не разрешены режимы выборки для текстур для текстур (то есть элементы AddressU, AddressV и AddressW из D3D11_SAMPLER_DESC не могут быть установлены на D3D11_TEXTURE_ADDRESS_WRAP).

     

4 На уровнях характеристик 10_0, 10_1 и 11_0 дисплейное устройство безоговорочно поддерживает использование двухмерных текстур с размерами, не равными двум.

ответил Adam 26 MaramMon, 26 Mar 2012 05:09:01 +04002012-03-26T05:09:01+04:0005 2012, 05:09:01
6

Графическое оборудование оптимизировано для операций с матрицами, операций фрагментов и векторных операций. Проще говоря, с квадратными матрицами легче справиться, так как вычисления могут выполняться в блоках (называемых фрагментами), аппаратное обеспечение оптимизировано для блочных операций, поэтому есть такие вещи, как файловые буферы, разветвление БД не распространяется на диск до тех пор, пока блок был заселен. То же самое относится к графической памяти.

Буфер кадра состоит из фрагментов, которые являются квадратными. Например, на экране с разрешением 800x600 и цветовым пространством RGB (0-255) есть 800x600 точек с 3 байтами каждого канала, в общей сложности 3x800x600 = 1,440,000 байт для адресации в буфере кадров. Это означает, что имеется 1,875 адресуемых фрагментов размером 256x256x3 байта. Поскольку данные текстуры являются квадратными, значительно упрощается сопоставление матрицы GRAM с матрицей экранного буфера с использованием бикубического масштабирования, где, как если бы он был не квадратным, смещение для более длинной стороны занимало бы больше времени, чтобы вычислить, когда это необходимо для масштабироваться.

Многие графические API-интерфейсы будут принимать нечетные текстурные данные, поскольку они принимают координаты UV-отображения как данные с плавающей запятой, однако после его отправки на графический процессор дополнение добавляется к текстурным данным, поскольку фактические пропорции изображения не изменение отображения кажется незатронутым, однако добавление текстуры добавляется к текстурным данным, поскольку графический процессор любит рассматривать его как идеальный квадрат.

Итак, если используется изображение 100x1024, и используется изображение 1024x1024, что означает, что 946 176 байтов потрачены впустую. Тем более, что композиция должна быть выполнена, потому что необходимо добавить альфа-канал, чтобы указать, что данные дополнений не должны влиять на композитную текстуру.

ответил awiebe 26 MarpmMon, 26 Mar 2012 12:20:12 +04002012-03-26T12:20:12+04:0012 2012, 12:20:12
1

Наш цифровой мир работает с двоичной нумерацией, тогда для умножения или деления на 2 значения вы можете «переместить» значение влево или вправо i.e.

<<  Left shift      x = 5 << 1    0101 << 1     1010     10
>>  Right shift     x = 5 >> 1    0101 >> 1     0010      2

Работа со значениями «мощность двух» для процессора более прост.

ответил esdebon 25 32015vEurope/Moscow11bEurope/MoscowWed, 25 Nov 2015 22:21:57 +0300 2015, 22:21:57
0

Современное оборудование может (наконец) справиться с включением режимов обтекания при отсутствии мощности двух текстур на основе, однако немощность двух текстур по-прежнему имеет тенденцию тратить память графического процессора, поскольку они имеют тенденцию увеличиваться по ширине на определенное количество аппаратных средств (либо на некоторый размер плитки, либо округлен до следующей мощности двух размеров, содержащей текстуру).

Поскольку это зависит от аппаратного обеспечения, и поставщики, как правило, не будут разбираться в специфике этих деталей, самое безопасное - продолжать использовать силу двух измерений для текстур, чтобы не тратить графический процессор.

ответил Zoner 2 Maypm12 2012, 21:49:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132