2016-09-15 5 views
0

Интересно, есть ли более эффективный способ в (расширенном) GLSL для выполнения следующих действий:GLSL: самый эффективный способ сделать 4 отфильтрованных текстурные выборки, в 4 различных координатах текстуры, из 4-х различных каналов

float r_1 = texture(my_texture, uv_1).x; 
float g_2 = texture(my_texture, uv_2).y; 
float b_3 = texture(my_texture, uv_3).z; 
float a_4 = texture(my_texture, uv_4).w; 
vec4 col = vec4(r_1, g_2, b_3, a_4); 

Обратите внимание, что координата uv отличается для каждого компонента (4 uv обычно близки друг к другу). Это 4 вида текстур, каждый из которых отбрасывает 3 возвращенных компонента, которые кажутся расточительными (и, да, есть узкое место вокруг этого, т. Е. Наличие единственного поиска текстуры() имеет заметную разницу в производительности по сравнению с 4 поисками) ,

Я вижу, что

gvec4 textureGatherOffsets(gsampler2D sampler, vec2 P, ivec2 offsets[4], [int comp]); 

Который несколько движется в правильном направлении, но он возвращает отфильтрованные значения тексел и принимает только постоянные смещения ivec2.

Я предполагаю, что я искал что-то вроде

gvec4 TextureWithSeparateCoordinateForEachComponent(gsampler2D sampler, vec2 P[4]); 

Есть ли что-то подобное в расширенном GLSL (или GLSL ES)?

// Редактировать: Это функция, которая может быть полезной для каждого приложения VR.

+0

... зачем вам это нужно? –

+0

Хроматическая аберрация – user1282931

ответ

1

Там, конечно, нет функции текстуры, которая делает это. И мы этого не ожидали.

См., Текстуры хранят цветовые каналы для каждого пикселя в соседних байтах. И доступ к памяти никогда не бывает таким маленьким, как один байт. По крайней мере, нет доступа к памяти из основной памяти в кеш. Обычно это делается в строках кэша, обычно размером около 32-64 байта. Соседние байт.

Так что, даже если вам не нужны другие три канала из этого пикселя, для большинства форматов текстур вам все равно придется читать, что данные. Таким образом, стоимость оплачивается.

Единственный способ полностью избежать дополнительных затрат на полосу пропускания - разместить каждый канал в отдельной текстуре (или отдельный слой массива в текстуре массива). Конечно, это требует, чтобы вы генерировали данные таким образом. Так что если это было из операции рендеринга, вам придется отображать 4 отдельных изображения.

+0

Как чтение из 4 разных текстур отличается от использования одной текстуры? Вы имеете в виду текстурное кэширование на основе UV-координат, которое становится эффективным, если только 1 UV указывает определенную текстуру? – codetiger