OpenGL 3.0 ES - дизъюнктное чтение и запись с одной и той же текстуры - PullRequest
0 голосов
/ 21 марта 2019

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

  1. Нарисуйте четырехэкранный квадроцикл и используйте тест ножниц, чтобы замаскировать самые внешние 1 пиксели, поэтому я пишу в nxn 'inner'текстуры.

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

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

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

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

1 Ответ

2 голосов
/ 22 марта 2019

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

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

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

...