Допустим, есть у нас две фрагмента кода вертексного шейдера:
1) Используется одна текстура, просто один раз она читается с интерполяцией, а другой раз - без интерполяции:
layout (binding = 0) uniform sampler2DArray texSampler_1_Nearest; // Физически одна и та же текстура layout (binding = 1) uniform sampler2DArray texSampler_1; // Физически одна и та же текстура vec4 color1 = texture(texSampler_1_Nearest, vec3(xy, 0)); vec4 color2 = texture(texSampler_1, vec3(xy, 0));
2) Используется одна две разных текстуры, первая один раз она читается с интерполяцией, а вторая раз - без интерполяции.
layout (binding = 0) uniform sampler2DArray texSampler_1_Nearest; // Эти две текстуры разные! layout (binding = 1) uniform sampler2DArray texSampler_2; // Эти две текстуры разные! vec4 color1 = texture(texSampler_1_Nearest, vec3(xy, 0)); vec4 color2 = texture(texSampler_2, vec3(xy, 0));
Интересует будет ли первый фрагмент кода выполняться быстрее за счет кэша или чего либо еще, и если будет - то насколько быстрее? Существенно или в пределах погрешности?
MikeNew
> Интересует будет ли первый фрагмент кода выполняться быстрее за счет кэша или чего либо еще
Да, в больнистве случаев будет
> и если будет - то насколько быстрее?
Напиши код и замерь
MrShoor
> Да, в больнистве случаев будет
Вот блин, жаль .. понятно, спасибо. :)
MikeNew
Делаю ставку .. в пределах погрешности
MikeNew
> Интересует будет ли первый фрагмент кода выполняться быстрее за счет кэша или чего либо еще, и если будет - то насколько быстрее?
Я тебе так кажу, прям вот сильно заморачиваться с оптимизацией под кеш не стоит, ну так, учитывать общие правила нужно конечно. Современные железки довольно таки мощные и все эти оптимизации едва ли дают существенный прирост. Вон в RTX-пайплайне вообще повсюду random access в память, т.к. ускоряющая структура разбросана в глобал мемори и ничего, всё летает.
Что же касается твоего конкретного примера - всё зависит от размера текстур, скорее всего после первого цикла рендера обе текстуры окажутся целиком в кеше и разницы будет ноль. Кеши сейчас большие на GPU, с чего ты взял, что туда попадёт только одна?
innuendo
> Делаю ставку .. в пределах погрешности
Почему?
Кэш не сработает из-за разницы в способах чтения с интерполяцией и без?
dominator, если будет использоваться большой объём данных, то стоит заморачиваться. Там где для маленьких программ это всё будет не заметно, для больших программ может оказаться катастрофично.
dominator
> Что же касается твоего конкретного примера - всё зависит от размера текстур, скорее всего после первого цикла рендера обе текстуры окажутся целиком в кеше и разницы будет ноль.
Текстуры 4к и кроме них будут читаться еще множество других текстур, так что вряд ли они обе в кэше останутся. Или я что-то не понимаю.
Немного практической конкретики - делается это для мультитекстурования террайна. В данный момент я все умещаю в одну RGBA-текстуру и у получается одновременно смешивать три текстуры и может быть 32 разных текстуры.
Была мысль перейти на две текстуры и иметь возможность смешивать пять текстур и иметь 64 разных текстуры, но если это заметно ударит по производительности, то оно того не стоит.
MikeNew
> Интересует будет ли первый фрагмент кода выполняться быстрее за счет кэша или чего либо еще,
нет не будет. Текстура 2 раза биндится- к разным текстурным unit ам, в разные места текстурной памяти. Видеокарта содержит ровно мах TextureUnit x max textureSize текстурной памяти, никакого кеша там нет при работе шейдеров.
MikeNew
Мой тебе совет как старпера ,...забей на скорость :)
MikeNew
И причем тут фильтрация ?
Тема в архиве.