Поведение текстуры кадрового буфера в OpenGL / OpenGLES - PullRequest
3 голосов
/ 23 июня 2011

В OpenGL / ES вы должны быть осторожны, чтобы не вызвать петлю обратной связи (считывание пикселей из той же текстуры, в которую вы пишете) при реализации функции рендеринга в текстуру.По очевидным причинам поведение не определено, когда вы читаете и пишете в одни и те же пиксели текстуры.Однако это также неопределенное поведение, если вы читаете и пишете в разные пиксели одной и той же текстуры?Примером может быть, если я пытаюсь сделать текстурный атлас с текстурой рендеринга внутри.Во время рендеринга в текстуру я считываю пиксели из другой текстуры, хранящейся в текстурном атласе.

Поскольку я не читаю и не пишу одни и те же пиксели в текстуре, поведение все еще считается неопределенным, просто потому, чтоданные приходят с той же текстуры?

Ответы [ 4 ]

3 голосов
/ 24 июня 2011

Однако это также неопределенное поведение, если вы читаете и пишете в разные пиксели одной и той же текстуры?

Да.

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

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

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

Расширение NV_texture_barrier позволяет вам обойти это. Несмотря на то, что это расширение NVIDIA, оно поддерживается и на оборудовании ATI. Это работает так, что вы вызываете функцию glTextureBarrierNV, когда хотите очистить все кэши. Таким образом, вы можете быть уверены, что когда вы читаете из какого-либо места, вы пишете в него.

Таким образом, идея заключается в том, что вы определяете одну область текстуры как область записи, а другую - область чтения. После того, как вы рендерили некоторые вещи, и вам нужно выполнить обратное чтение, вы снимаете барьер и меняете области текстуры. Это похоже на пинг-понг текстуры, но без тяжелой операции по добавлению новой текстуры, привязке FBO или смене буферов.

1 голос
/ 23 июня 2011

Проблема не столько в возможности петель обратной связи (технически это не приведет к петле, а в неопределенном порядке, в котором пиксели считываются / записываются, что приводит к неопределенному поведению), но и в ограничениях режимов доступа, которые реализуются графическими процессорами. : Буфер может быть либо только прочитан, либо записан в любой момент времени (сбор или доступ с разбросом). И GPU всегда видит буфер в целом. Это главная причина этого ограничения.

0 голосов
/ 23 июня 2011

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

0 голосов
/ 23 июня 2011

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

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

...