OpenGL 3.0 ES — раздельное чтение и запись из одной и той же текстуры

Я нахожусь в ситуации, когда у меня есть (n+1)x(n+1) текстура, прикрепленная к фреймбуферу. Моя идея состоит в том, чтобы обновить эту текстуру за 2 прохода.

  1. Нарисуйте полноэкранный четырехугольник и используйте тест ножниц, чтобы замаскировать крайний 1 пиксель, поэтому я записываю n x n «внутренних» пикселей текстуры.

  2. Второй проход, когда я рисую линейные примитивы для записи в крайние пиксели и обновляю ту же текстуру, используя результат первого прохода в качестве входных данных. Вычисления на этом шаге зависят от состояния внутренней (n x n) сетки, которая была рассчитана на первом проходе.

Во втором проходе я бы привязал результат первого прохода как для чтения, так и для записи. Я знаю, что в соответствии с OpenGL это приведет к неопределенному поведению, но, поскольку я никогда не читаю и не пишу одновременно из одних и тех же текселей, я думаю, что это может сработать.

Это хорошая идея сделать это так, или, возможно, лучше нарисовать полноэкранный четырехугольник, а в моем шейдере glsl сделать проверку, например:

if (gl_FragCoord.x == 0.5 || gl_FragCoord.x == n + 0.5){
   ...
}

person user3042966    schedule 21.03.2019    source источник


Ответы (1)


Как вы говорите, OpenGL говорит, что это неопределенное поведение, поэтому оно не будет работать. Лучше всего для подобных вещей использовать пинг-понг между двумя целями рендеринга.

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

К сожалению, это не помогает. На самом деле, есть расширения, распространенные на мобильных устройствах (в частности, графические процессоры Mali и PowerVR), которые позволяют вам читать и писать одновременно, но только если это одни и те же тексели. Google «Локальное хранилище пикселей» для получения подробной информации.

person Columbo    schedule 22.03.2019