Opengl и Webgl: выборка из текстуры, прикрепленной к текущему кадровому буферу - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть кадровый буфер с двумя текстурами t0 и t1.

На первом проходе я рендеринг им обоим с выводом нескольких фрагментов шейдера.

Перед вторымпройти я делаю следующее:

  • Включить шейдер только с одним выводом
  • Привязать t1 к текстурному блоку
  • вызвать glDrawBuffers, чтобы отключить запись в *Приложение 1015 *

Обратите внимание, что t1 используется для выборки, но он все еще привязан к текущему кадровому буферу.Как я понимаю, в такой конфигурации нет петель.

Законно ли это как в OpenGL, так и в WebGL?

Я сделал пример , который отлично работает в Chrome и Firefoxпод Linux, но отображает черный экран в обоих браузерах для Windows.Является ли это причиной реализации Webgl, поддерживаемой D3D, и ее агрессивное развязывание текстуры, как указано здесь ?

Ответы [ 2 ]

0 голосов
/ 17 июля 2018

Это недопустимо как в WebGL1, так и в WebGL2. WebGL требуется для генерации ошибки INVALID_OPERATION, если есть петля обратной связи.

Из раздела спецификаций 6.25

6.25 Циклы обратной связи между текстурами и кадровым буфером

В API OpenGL ES 2.0 можно совершать вызовы, которые пишут и читают с одной и той же текстуры, создавая цикл обратной связи. Он указывает, что там, где существуют эти петли обратной связи, результаты неопределенного поведения.

В API WebGL такие операции, которые вызовут такие петли обратной связи (согласно определениям в спецификации OpenGL ES 2.0), вместо этого вызовут ошибку INVALID_OPERATION.

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

0 голосов
/ 25 апреля 2018

Как я понимаю, в такой конфигурации нет петель.

Но есть один.

В пре-GL 4.5 (который включает в себя WebGL) петли обратной связи происходят каждый раз, когда вы читаете текстуру, которая в данный момент присоединена к кадровому буферу. Неважно, если вы не пишете в данный момент. Неважно, что вы не можете писать в него в данный момент. Пока он подключен к кадровому буферу, вы получаете неопределенное поведение при чтении к нему (если только они не считываются с неподключенных уровней mipmap).

В после GL 4.5 (который не не включает WebGL) или с расширением текстурного барьера, это смягчается. Но недостаточно, чтобы решить вашу проблему. UB по-прежнему срабатывает, когда вы пытаетесь прочитать пиксели, записанные во время предыдущего вызова, из изображения, которое все еще прикреплено к кадровому буферу.

Таким образом, вы должны либо изменить FBO, чтобы изображение больше не прикреплялось, либо создать текстурный барьер (если у вас есть доступ к 4.5 / ARB / NV_texture_barrier, что на настольном GL вы, вероятно, делаете).

...