Чому доступ до текстур набагато повільніше при обчисленні координати текстури в шейдері фрагмента?


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);
    // ...
}

Якщо перевертання координати y або ще простіша операція, наприклад додавання vec2(0.5)до координати текстури, виконується в шейдері фрагмента, доступ до текстури стає набагато повільнішим. Чому?


Як зауваження, наприклад, змішування двох текстур із застосуванням зваженої їх суми значно дешевше за час, а також потрібно робити для кожного пікселя, тому сам розрахунок координати текстури не здається таким дорогим.


1
Я думаю, що якщо УФ-координати обчислюються в VS, одиниця текстури може почати попередньо вибирати їх під час запуску PS. Якщо вони обчислені в PS, одиницю текстури потрібно спочатку почекати.
RichieSams

2
Fwiw це називається "залежною текстурою читання", якщо це допоможе вашому пошуку.
Алан Вулф

Чи є у вас кілька вимірювань, які показують різницю парфуму? Я насправді не очікував, що взагалі буде велика різниця; затримка текстури повинна заграти кілька опцій ALU. BTW, залежні зчитування текстури - це там, де є два (або більше) зчитування текстури, при цьому координати для другого залежать від виходу першого. Вони повільніші через чітке впорядкування, необхідне між двома текстурними читаннями.
Натан Рід

Що ж, будь-яка операція, виконана в фрагменті шейдера, буде дорожчою, ніж у вершинній шейдері. Кожен трикутник займає 3 виклику вершинного шейдера, але це може зайняти на порядок більше викликів фрагмента шейдера, залежно від його розміру екрана.
гламперт

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

Відповіді:


11

Те, про що ви говорите, зазвичай називають "залежною текстурою читання" у спільноті мобільних розробників. Це деталізація реалізації певного обладнання, а отже, це дійсно залежить від GPU щодо того, має він чи не має ніяких наслідків для продуктивності. Як правило, це щось, що ви бачите на PowerVR GPU в Apple, оскільки це було чітко зазначено як у Imagination, так і в Appleдокументація. Якщо я пам'ятаю правильно, проблема в основному виходила з апаратного забезпечення в GPU, яке б почало попередньо вибирати текстури до того, як шейдер фрагмента навіть почав працювати, щоб він міг краще приховати затримку. Документи, з якими я пов’язував, згадують, що це більше не проблема апаратного забезпечення Series6, тому принаймні щодо новітнього обладнання Apple це не те, про що ви повинні турбуватися. Я, чесно кажучи, не впевнений в інших мобільних графічних процесорах, оскільки це не моя область знань. Спробуйте проконсультуватися з їхньою документацією, щоб дізнатися точно.

Якщо ви вирішили здійснити пошук у цьому питанні Google, пам’ятайте, що ви, ймовірно, знайдете старіші матеріали, які говорять про залежність текстурних файлів на старих пристроях настільних ПК. Основний у перші дні шейдери пікселів / фрагментів, термін "залежний вибір текстури" позначав із використанням УФ-адреси, що спиралася на попередній вибір текстури. Класичний приклад - рендеринг карток навколишнього середовища, де ви хочете використати вектор відображення на основі звичайної карти, щоб відібрати карту навколишнього середовища. На цьому старшому обладнанні були деякі основні наслідки для продуктивності, і я думаю, що він навіть не підтримувався на деяких дуже старих графічних процесорах. З сучасними графічними процесорами апаратне забезпечення та шейдер ISA набагато узагальненіші, а тому ситуація з роботою значно складніша.


До речі: я відчував це на iPad 3. Тож, можливо, це насправді специфічно обладнання.
Nero
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.