Вулкан обновляет дескриптор каждого кадра - PullRequest
0 голосов
/ 21 мая 2018

Я хочу визуализировать свою сцену в текстуру, а затем использовать эту текстуру в шейдере, поэтому я создал frambuffer с использованием imageview и записал для этого буфер команд.Я успешно загрузил и выполнил буфер команд на gpu, но дескриптор imageview черный.Я создаю дескриптор из изображения до цикла рендеринга.Это черный, потому что я создаю его до того, как что-то передается в фреймбуфер?Если это так, мне придется обновлять дескриптор каждый кадр.Придется ли мне создавать новый дескриптор из изображения в каждом кадре?Или есть другой способ, которым я могу сделать это?

Я прочитал другую ветку на этот заголовок.Не помечайте это как дубликат, потому что поток связан с текстурами, а это текстура из изображения.

Спасибо.

1 Ответ

0 голосов
/ 22 мая 2018

@ IAS0601 Я отвечу на вопросы из Вашего комментария с помощью ответа, так как он позволяет писать текст намного длиннее, а его форматирование намного лучше.Я надеюсь, что это также отвечает на Ваш первоначальный вопрос, но Вы не должны относиться как к ответу.Как я уже писал, я не уверен, о чем Вы спрашиваете.

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

Поэтому, когда вы создаете фрейм-буфер и визуализируете в него, вы визуализируете висходные изображения или, точнее говоря, к тем частям исходных изображений, которые были указаны при просмотре изображений.Например, у вас есть 2D текстура с 3 слоями массива.Вы создаете 2D изображение для среднего (второго) слоя.Затем Вы используете этот вид изображения при создании кадрового буфера.И теперь, когда вы рендеритесь в этот кадровый буфер, фактически вы рендеритесь во второй слой исходного массива 2D-текстур.

Другое дело - когда вы позже получаете доступ к тому же изображению и когда вы используете тот же вид изображения, Вы все еще получаете доступ к исходному изображению.Если вы визуализировали что-то в изображение, то вы получите обновленные данные (при условии, что вы все сделали правильно, например, выполните соответствующие операции синхронизации, переход макета при необходимости и т. Д.).Я надеюсь, что это то, что Вы подразумеваете под обновлением представления изображения .

2) Я не уверен, что Вы имеете в виду, обновляя набор дескрипторов.В Vulkan, когда мы обновляем набор дескрипторов, это означает, что мы указываем дескрипторы ресурсов Vulkan, которые должны использоваться через данный набор дескрипторов.

Если я правильно вас понимаю - вы хотите что-то визуализировать в изображение.Вы создаете представление изображения для этого изображения и предоставляете это представление изображения во время создания кадрового буфера.Затем вы делаете что-то в этом фреймбуфере.Теперь вы хотите прочитать данные с этого изображения.У вас есть два варианта.Если вы хотите получить доступ только к одному образцу местоположения, связанному с местоположением фрагментного шейдера, это можно сделать с помощью входного вложения в следующем подпроходе того же прохода рендеринга.Но таким образом Вы можете выполнять только те операции, которые не требуют доступа к нескольким текселям, например, цветокоррекцию.

Но если вы хотите сделать что-то более сложное, например размытие или отображение теней, если вам нужен доступДля нескольких текселей Вы должны закончить проход рендера и начать еще один.На этом втором этапе рендеринга вы можете прочитать данные из исходного изображения через набор дескрипторов.Неважно, когда этот набор дескрипторов был создан и обновлен (когда был задан дескриптор представления изображения).Если вы не меняете дескрипторы ресурсов, то есть, если вы не создаете новое изображение или новое представление изображения, вы можете использовать тот же набор дескрипторов, и вы получите доступ к данным, отображаемым при первом проходе рендеринга.

Если у вас есть проблемы с доступом к данным, например (как вы писали), вы получаете только черные цвета, это говорит о том, что вы не все выполнили правильно - рендеринг проходной загрузки или операции хранения некорректны, или начальные и конечные макетыневерен.Или синхронизация не выполняется правильно.К сожалению, без доступа к Вашему проекту мы не можем быть уверены, что не так.

...