Почему доступ к текстурам намного медленнее при расчете координат текстуры в фрагментном шейдере?

11

При использовании текстур в GLSL лучше всего рассчитать окончательные координаты текстуры в вершинном шейдере и передать их фрагментному шейдеру, используя varyings. Пример с простым переворотом в координате y:

// Vertex shader
attribute vec2 texture;
varying highp vec2 texCoord;
// ...
void main() {
    texCoord = vec2(texture.x, 1.0-texture.y);
    // ...
}

// Fragment shader
varying highp vec2 textureCoordinates;
uniform sampler2D tex;
// ...
void main() {
    highp vec4 texColor = texture2D(tex, texCoord);
    // ...
}

Если vec2(0.5)в фрагментном шейдере выполняется переворот в координате y или даже более простая операция, такая как добавление к координате текстуры, доступ к текстуре происходит намного медленнее. Почему?


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

Нерон
источник
1
Я предполагаю, что если UV-координаты рассчитываются в VS, текстурный блок может начать их предварительную выборку во время запуска PS. Если они рассчитаны в PS, текстурный блок должен ждать первым.
RichieSams
2
Кстати, это называется «зависимое чтение текстур», в случае, если это помогает вашему поиску.
Алан Вулф
Есть ли у вас какие-либо измерения, показывающие разницу в производительности? Я действительно не ожидал бы, что будет большая разница вообще; задержка извлечения текстуры должна затопить несколько операций ALU. Кстати, зависимые чтения текстуры - это те, где есть два (или более) чтения текстуры, причем координаты для второго зависят от выходных данных первого. Они медленнее из-за строгого порядка, необходимого между двумя текстурными чтениями.
Натан Рид
Ну, любая операция, выполняемая в фрагментном шейдере, будет дороже, чем в вершинном шейдере. Каждый треугольник принимает 3 вызова вершинного шейдера, но может потребоваться на несколько порядков больше вызовов фрагментного шейдера, в зависимости от размера его экрана.
гламперт
@NathanReed Я не думаю, что вы должны ограничивать «зависимые чтения текстур» только теми, которые получены из предыдущего доступа к текстуре. Вероятно, я бы также включил любые координаты, вычисленные в фрагментном шейдере, в отличие от тех, которые можно определить просто по линейной (ну, гиперболической с точки зрения) интерполяции атрибутов вершин.
Симон Ф

Ответы:

11

То, о чем вы говорите, обычно называется «зависимым чтением текстур» в сообществе разработчиков мобильных приложений. Это деталь реализации определенного аппаратного обеспечения, и поэтому он действительно зависит от графического процессора, имеет ли он какие-либо последствия для производительности. Как правило, это то, что вы видите для графических процессоров PowerVR на оборудовании Apple, так как это было явно упомянуто и в Imagination, и в Apple.документация. Если я правильно помню, проблема в основном возникла из-за аппаратного обеспечения в графическом процессоре, который начал бы предварительную выборку текстур еще до того, как фрагментный шейдер начал работать, чтобы он мог лучше скрыть задержку. В документах, на которые я ссылаюсь, упоминается, что это больше не проблема оборудования Series6, поэтому, по крайней мере, на новом оборудовании Apple это не то, о чем вам нужно беспокоиться. Я, честно говоря, не уверен насчет других мобильных графических процессоров, поскольку это не моя область знаний. Вы должны попробовать и ознакомиться с их документацией, чтобы узнать наверняка.

Если вы решите выполнить поиск в Google по этой проблеме, имейте в виду, что вы, вероятно, найдете более старый материал, в котором говорится о зависимых выборках текстур на старом настольном оборудовании. Основной в первые годы пиксельных / фрагментных шейдеров, термин «зависимая выборка текстуры» относился к использованию УФ-адреса, который полагался на предыдущую выборку текстуры. Классическим примером был рендеринг карты окружающей среды с рельефным отображением, где вы хотели использовать вектор отражения, основанный на карте нормалей, для выборки карты окружающей среды. На этом старом оборудовании были некоторые существенные проблемы с производительностью, и я думаю, что это даже не поддерживалось на некоторых очень старых графических процессорах. В современных графических процессорах аппаратное обеспечение и шейдер ISA гораздо более обобщены, поэтому ситуация с производительностью намного сложнее.

ДСМ
источник
Кстати, я испытал это на iPad 3. Так что, возможно, это на самом деле зависит от оборудования.
Nero