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