Доступны ли текстуры без памяти для использования с несколькими MTLRenderCommandEncoders? Например (теоретически) я создаю командный кодировщик № 1 и текстуру без памяти № 1 и использую его в качестве цели рендеринга, затем создаю командный кодировщик № 2 и текстуру без памяти № 2 в качестве цели рендеринга, но использую текстуру № 1 в качестве аргумента во фрагментном шейдере (читай только доступ). Будет ли это работать?
Краткий ответ: нет, это не сработает. Вы должны сделать это в одном кодировщике команд рендеринга.
Я предполагаю, что вы хотите прочитать содержимое всей текстуры в кодировщике рендеринга № 2, что невозможно на тайловых графических процессорах Apple (единственных графических процессорах, работающих под управлением Metal, которые фактически будут поддерживать цели рендеринга без памяти). Если вы хотите прочитать что-либо, кроме содержимого текущего тайла, вы должны сохранить вложение в системной памяти, именно так работают отложенные рендереры на основе тайлов. Для получения дополнительной информации см. этот доклад и другие доклады WWDC о тайловых шейдерах и оптимизации игр.
Длинный ответ: в конце кодировщика рендеринга Metal должен выполнить действие сохранения по вашему выбору, через которое вы прошли MTLRenderPassDescriptor
. Причина, по которой это необходимо, заключается в том, что существует множество внутренних синхронизаций, включая заборы и барьеры, которые гарантируют, что следующий кодировщик, который фактически использует вложения предыдущего кодировщика в качестве целей рендеринга или сэмплированной текстуры, сможет прочитать все, что там написано.
Надеюсь, что это ответ на ваш вопрос.