Выборка из текстуры, которая также является целью рендеринга

Я знаю, что технически это не поддерживается (и, насколько я могу судить, это неопределенное поведение), но действительно ли это фатально ужасная вещь для выборки из текстуры, которая также записывается?

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

Спасибо за любую помощь!


person meds    schedule 01.11.2010    source источник


Ответы (2)


Да, это фатально и вызывает неопределенное поведение. Просто сделайте копию и читайте с копии.

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

person Dr. Snoopy    schedule 01.11.2010
comment
Также стоит иметь в виду, что чтение из текстуры происходит немного заранее из-за кэширования и конвейерной обработки. Это означает, что вы можете пытаться прочитать пиксель из кеша, который был изменен в фактической текстуре. - person Goz; 01.11.2010

Матиас и Гоз рассказали о самых важных моментах. Добавлю пару интересных фактов:

  • Среда выполнения Direct3D активно отвязывает текстуры, когда вы привязываете их базовый ресурс в качестве цели рендеринга (поэтому вы не можете создать там цикл).
  • БПЛА в Direct3D 11 фактически позволяют выполнять операции чтения-изменения-записи в подмножестве форматов (тех, которые не требуют преобразования типов). Однако они не гарантируют какой-либо порядок работы. Это то, что используется рядом алгоритмов, которые обеспечивают независимую от порядка прозрачность, в частности (где изменение порядка выполняется вручную).
person Bahbar    schedule 02.11.2010