При использовании текстур в GLSL лучше всего рассчитать окончательные координаты текстуры в вершинном шейдере и передать их фрагментному шейдеру, используя varying
s. Пример с простым переворотом в координате 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 или даже более простая операция, такая как добавление к координате текстуры, доступ к текстуре происходит намного медленнее. Почему?
Как примечание, например, смешивание двух текстур с использованием их взвешенной суммы намного дешевле с точки зрения времени и также должно выполняться для каждого пикселя, поэтому вычисление самой координаты текстуры не кажется таким дорогостоящим.
Ответы:
То, о чем вы говорите, обычно называется «зависимым чтением текстур» в сообществе разработчиков мобильных приложений. Это деталь реализации определенного аппаратного обеспечения, и поэтому он действительно зависит от графического процессора, имеет ли он какие-либо последствия для производительности. Как правило, это то, что вы видите для графических процессоров PowerVR на оборудовании Apple, так как это было явно упомянуто и в Imagination, и в Apple.документация. Если я правильно помню, проблема в основном возникла из-за аппаратного обеспечения в графическом процессоре, который начал бы предварительную выборку текстур еще до того, как фрагментный шейдер начал работать, чтобы он мог лучше скрыть задержку. В документах, на которые я ссылаюсь, упоминается, что это больше не проблема оборудования Series6, поэтому, по крайней мере, на новом оборудовании Apple это не то, о чем вам нужно беспокоиться. Я, честно говоря, не уверен насчет других мобильных графических процессоров, поскольку это не моя область знаний. Вы должны попробовать и ознакомиться с их документацией, чтобы узнать наверняка.
Если вы решите выполнить поиск в Google по этой проблеме, имейте в виду, что вы, вероятно, найдете более старый материал, в котором говорится о зависимых выборках текстур на старом настольном оборудовании. Основной в первые годы пиксельных / фрагментных шейдеров, термин «зависимая выборка текстуры» относился к использованию УФ-адреса, который полагался на предыдущую выборку текстуры. Классическим примером был рендеринг карты окружающей среды с рельефным отображением, где вы хотели использовать вектор отражения, основанный на карте нормалей, для выборки карты окружающей среды. На этом старом оборудовании были некоторые существенные проблемы с производительностью, и я думаю, что это даже не поддерживалось на некоторых очень старых графических процессорах. В современных графических процессорах аппаратное обеспечение и шейдер ISA гораздо более обобщены, поэтому ситуация с производительностью намного сложнее.
источник