Есть ли способ получить доступ к вектору по координатам, как если бы вы использовали текстуру в GLSL? - PullRequest
1 голос
/ 01 апреля 2019

Я реализую алгоритм извлечения объектов с помощью OpenGL ES 3.0 (учитывая входную текстуру с некоторыми единицами и в основном 0, создайте выходную текстуру с помеченными областями объектов).Проблема, с которой я сталкиваюсь в своем фрагментном шейдере, заключается в том, как выполнить «поиск» в промежуточном vec или float, а не в сэмплере.

Концептуально каждый vec или float - это просто функция, вычисляемая на основе текселей, поэтому следуетбыть способом получить его значение, учитывая тексельные координаты, что-то вроде textureLikeLookup (texel_valued, v_color) - но я не нашел ничего похожего на текстуру * функции.

Опции, которые я вижу:

  1. Рендеринг моего вектора в кадровый буфер и передача его в качестве текстуры в другой проход шейдера / рендеринга - нежелательно, потому что у меня много таких проходов в цикле, и я хочу избежать чередования вызовов ЦП;
  2. Переключитесь на ES 3.1 и воспользуйтесь преимуществами imageStore (https://www.khronos.org/registry/OpenGL-Refpages/es3.1/html/imageStore.xhtml) - кажется очевидным, что если я смогу обновить промежуточное изображение в своем шейдере, то я смогу добиться этого в фрагментном шейдере (см. https://www.reddit.com/r/opengl/comments/279fc7/glsl_frag_update_values_to_a_texturemap_within/),, ноЯ бы предпочел придерживаться версии 3.0, если это возможно.

Есть ли лучший / естественный способ решения этой проблемы?по ее словам, сделайте что-то вроде этого

// works, because tex_sampler is a sampler2D
vec4 texel_valued = texture(tex_sampler, v_color); 

, когда данные не являются sampler2D, а vec:

// doesn't work, because texel_valued is not a sampler but a vec4
vec4 oops = texture(texel_valued, v_color);
...