Запись в буфер глубины из вычислительного шейдера opengl

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

В частности, меня интересуют опасения по поводу HiZ. Также мне интересно, лучше ли выполнять модификации вычисляемого шейдера в буфере глубины до или после рендеринга графики?

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


person iam    schedule 24.07.2016    source источник


Ответы (1)


Насколько мне известно, вы не можете связывать текстуры с любым из форматов глубины в качестве изображений и, следовательно, не можете записывать текстуры формата глубины в вычислительных шейдерах. См. документацию по glBindImageTexture, в ней перечислены форматы, которые должен иметь ваш формат текстуры. быть совместимым с. Форматы глубины не входят в их число, и в спецификации говорится, что форматы глубины несовместимы с обычными форматами.

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

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

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

Но, возможно, этот вопрос спорный, поскольку кажется, что вы вообще не можете вручную записывать в буферы глубины - что также может ответить на ваш третий вопрос - не записывая в буферы глубины, вы не можете связываться со сжатием его :)

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

person karyon    schedule 24.07.2016
comment
Я думаю, вы уловили большую часть вопроса, но конкретная часть заключается в том, как GPU могут сохранять буферы глубины в более оптимальных формах для таких вещей, как HiZ culling и т. Д. Поэтому я специально искал ответ от кого-то с опытом подобного взаимодействия - person iam; 27.07.2016
comment
просто чтобы убедиться, что мы на одной странице, HiZ графических процессоров - это аппаратная функция, которая (афайк) открыто не документирована, также ничто из того, что вы делаете в вычислительных шейдерах, не выиграет от этой функции или не помешает ей, она предназначена для ускорения растеризация, не более того. Если вы хотите узнать, как работает HiZ, я могу порекомендовать fgiesen.wordpress.com/2011/07/08/, но вам не о чем беспокоиться, если вы не оптимизируете низкоуровневую часть растеризации рендеринга. трубопровод. - person karyon; 27.07.2016
comment
HiZ использует сжатые / оптимизированные / реорганизованные формы буфера глубины, специфичные для конкретных производителей. Некоторые операции вынуждают графический процессор преобразовывать из этого, например, доступ шейдера к буферу глубины напрямую, что может замедлить работу. Мне было интересно, сталкивался ли кто-нибудь с конкретными более быстрыми путями при интеграции с материалами, основанными на вычислениях. Кажется, нет! - person iam; 28.07.2016