MTKView обновляет буфер кадров без очистки предыдущего содержимого

#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 действие без получения мусора, странного мигания или чего-либо еще. У вас будет полный контроль над тем, какую текстуру вы визуализируете и каково ее содержимое.

После рендеринга для этой текстуры для прохода рендеринга вам затем нужно перенести это в текстуру объекта рисования для отображения.

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