#swift #buffer #metal #render-to-texture #metalkit
#swift #буфер #Металлические #преобразование в текстуру #metalkit
Вопрос:
Я работаю над программой рисования, в которой я рисую интерактивные штрихи с помощью MTKView. Если я установлю для renderPassDescriptor loadAction значение «очистить»:
renderPassDescriptor?.colorAttachments[0].loadAction = .clear
Буфер кадров, как и ожидалось, показывает последнее содержимое renderCommandEncoder?.drawPrimitives
, которое в данном случае является передним краем мазка кисти.
Если я установлю loadAction на ‘load’:
renderPassDescriptor?.colorAttachments[0].loadAction = .load
Буфер кадров мигает как сумасшедший и показывает фрагментарный след того, что я только что нарисовал. Теперь я понимаю, что мигание, вероятно, вызвано тройной буферизацией MTKView по умолчанию. Таким образом, каждый раз, когда я записываю в currentDrawable, я, скорее всего, записываю в один из 3 циклических буферов. Пожалуйста, поправьте меня, если я ошибаюсь.
Мой вопрос в том, что мне нужно сделать, чтобы нарисовать чистый мазок кисти без мигания буфера кадров, как это происходит сейчас? Другими словами, есть ли способ создать главный буфер, который обновляется последним содержимым commandEncoder?
Ответ №1:
Вы можете использовать собственную текстуру в качестве цветового вложения при прохождении рендеринга. Вам не обязательно использовать текстуру для рисования. Таким образом, вы можете использовать .load
действие без получения мусора, странного мигания или чего-либо еще. У вас будет полный контроль над тем, какую текстуру вы визуализируете и каково ее содержимое.
После рендеринга для этой текстуры для прохода рендеринга вам затем нужно перенести это в текстуру объекта рисования для отображения.
Основная сложность здесь заключается в том, что у вас не будет преимуществ двойной или тройной буферизации. Вы потеряете определенный уровень производительности, поскольку все должно быть синхронизировано с состоянием этой текстуры. Однако я подозреваю, что вам не нужна такая высокая производительность, поскольку это интерактивно и должно соответствовать скорости только человека.