OpenGL, почему повторение текстуры с одинаковым количеством фрагментов может стоить производительности? - PullRequest
0 голосов
/ 09 мая 2018

У меня квадратор одинарного размера с бесшовной текстурой и с повторением текстур.

Для координат текстуры я получаю это с позиции. Поэтому я могу искусственно повысить разрешение текстуры, умножив координаты текстуры на коэффициент N, что заставит текстуру повторяться в течение четырех * N раз.

В моем коде моя текстура - это карта нормалей, и с ее помощью в фрагментном шейдере выполняется расчет бликов. И я заметил, что чем больше я умножаю координаты текстуры, тем больше снижается моя производительность, однако кажется, что падение производительности остается постоянным после определенного значения (например, нет разницы между N = 1024 и N = 10240)

Что я не понимаю, так это то, что размер квадратов остается прежним, размер текстур одинаков, почему умножение координат текстур стоит мне производительности при одинаковом количестве фрагментов?

1 Ответ

0 голосов
/ 09 мая 2018

Без отображения, я использую GL_LINEAR для фильтрации как мин, так и фильтров.

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

При масштабе ближе к 1: 1 соседние пиксели в фрагментном шейдере будут взяты из текселей, которые также расположены близко друг к другу. Это означает, что они будут близко друг к другу в памяти, что означает лучшую локальность памяти. Это требует меньше выборок из памяти.

Текстуры с MipMap не имеют этой проблемы, и они часто выглядят также лучше, потому что у них нет проблем с псевдонимами, которые вы видите при минимизации GL_LINEAR.

Имитация его на процессоре

У CPU такая же проблема с извлечением памяти.

float sum(float *arr, int size, int stride, int count) {
    int pos = 0;
    float sum = 0.0f;
    for (int i = 0; i < count; i++) {
        pos = (pos + stride) % size;
        sum += arr[pos];
    }
    return sum;
}

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

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