Действительно ли мультитекстурирование просто «использует более одной текстуры»?

10

Это может показаться глупым, но это меня беспокоит. Из того, что я понимаю, мультитекстурирование - это просто использование более 1 текстуры на шейдер (обычно для их смешивания). Поэтому вместо создания 1 текстуры я создаю 2 или более, что ... довольно очевидно!

Почему для этого существует специальный термин? Есть ли что-то большее, чем просто «использование более 1 текстуры»? Я что-то пропустил?

NPS
источник
В какой-то момент, особенно в 3D-графике в реальном времени, использование одной текстуры (диффузной карты) было очень распространено. Поэтому имя использовалось, чтобы предположить, что вы используете более одной текстуры. Я не вижу проблемы. Очень похоже на многопоточность
AturSams
Но многопоточность требует специального API, совершенно другого дизайна программы и так далее. Это отличается во многих аспектах. Мой вопрос проистекает из того факта, что мультитекстурирование, кажется, не имеет ничего другого, кроме количества текстур. И это не проблема, просто вопрос.
NPS
Не требует специального API. Это будет зависеть от реализации. Я использую некоторые инструменты, которые обрабатывают мультитекстуру так же, как они бы «unitexture»;)
AturSams
@concept Какая часть? Название?
Анко

Ответы:

16

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

Начиная с OpenGL 1.1 (фиксированная функциональность) мультитекстурирование было представлено как новое состояние API. Вместо того, чтобы связывать только одну текстуру, она дала вам возможность связывать несколько текстур; по одному на каждую текстурную единицу, а затем смешивать их, используя один из параметров текстурной среды, blend, modulate..etc 1

Затем были введены объединители текстур , которые дали возможность комбинировать набор текстур, используя более гибкие операции, давая вам возможность передавать параметры фиксированному набору операций (представьте, что это шейдеры, но с фиксированным набором параметров), это было более гибкий, чем оригинальные «комбайнеры».

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

Дело здесь; даже если он стал тривиальным, этот термин сохранился как общий термин для любой операции, описывающей выборку и свертку нескольких текстур.

1 Я использую свою память, чтобы вспомнить фиксированную функциональность OpenGL, исправьте меня, если я пропустил что-то.

concept3d
источник
5

Историческая причина в том, что когда-то давно «мультитекстурирование» было маркетинговым модным словом, подобным «аппаратному TnL». Поскольку это была отличительная особенность новых карт, нужно было слово, чтобы продать их.

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

Разница не в том, что вы можете создать несколько текстур, а в том, что вы комбинируете две или более текстур. Например, вы можете смешивать их на основе альфа или некоторых интерполированных коэффициентов смешивания для каждой вершины, или вы можете добавить их, или что-то другое.
Количество конфигурируемости / программируемости значительно изменилось за последнее десятилетие, но остается одно большое отличие: вы можете каким-то образом объединить два или более входных данных в один выходной.

Damon
источник
2

В начале был свет

В частности, освещение OpenGL, в котором указаны определенные математические операции, которые будут применены к фрагменту, которые затем были объединены с текстурами для получения окончательного цвета.

А потом был Quake

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

Однако оборудование того времени не поддерживало это ни в одной операции. Поэтому Quake нужно было нарисовать объекты сцены дважды:

  • Нарисуйте все один раз, чтобы сложить базовые текстуры.
  • Установите режим наложения модуляции.
  • Нарисуйте все во второй раз, чтобы применить текстуры освещения.

Это конечно было медленно; Мало того, что всю геометрию нужно было трансформировать и обрезать дважды (что в те дни было операцией ЦП), но и каждый пиксель на экране был дважды затронут во время рендеринга.

Введите мультитекстуру

Multitexture была решением этой проблемы, и первоначально была представлена ​​через расширение GL_SGIS_multitexture, которое существовало только на определенных потребительских картах 3DFX. Первоначально он позволял смешивать только две текстуры (и с ограниченным набором режимов наложения).

Цитата из оригинального readme GLQuake :

GL_SGIS_multitexture
Поддержка мультитекстур позволяет определенному оборудованию отображать мир за один проход вместо двух. GLQuake использует два прохода, один для текстур мира и второй для световых карт, которые смешиваются с текстурами. На некоторых аппаратных средствах с поддержкой OpenGL GL_SIGS_multitexture это можно сделать за один проход. На оборудовании, которое поддерживает это, вы получите увеличение частоты кадров от 60 до 100%. В настоящее время только 3DFX с двумя картами TMU (такими как Obsidian 2220) поддерживают это расширение, но вскоре появится и другое оборудование.

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

И так до настоящего времени

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

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

Дальнейшее чтение истории всего этого доступно здесь , и хорошая историческая рецензия (более широкого контекста и той роли, которую играет в нем мультитекстурирование) в этом ответе Programmers.SE .

Максимус Минимус
источник