Я работаю над программой рисования, в которой я рисую интерактивные штрихи через MTKView. Если я установлю для loadAction renderPassDescriptor значение 'clear':

renderPassDescriptor?.colorAttachments[0].loadAction = .clear

Буфер кадра, как и ожидалось, показывает последнее содержимое renderCommandEncoder?.drawPrimitives, которое в данном случае является передним краем мазка кисти.

Если я установил loadAction на 'load':

renderPassDescriptor?.colorAttachments[0].loadAction = .load 

Буфер кадра мигает как сумасшедший и показывает неоднородный след того, что я только что нарисовал. Теперь я понимаю, что мигание, вероятно, вызвано тройной буферизацией MTKView по умолчанию. Таким образом, каждый раз, когда я пишу в currentDrawable, я, скорее всего, пишу в один из трех циклических буферов. Пожалуйста, поправьте меня, если я ошибаюсь.

У меня вопрос: что мне нужно сделать, чтобы нарисовать чистый мазок без мигания буфера кадра, как сейчас? Другими словами, есть ли способ иметь главный буфер, который обновляется последним содержимым commandEncoder?

5
Plutovman 30 Мар 2019 в 23:17

1 ответ

Лучший ответ

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

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

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

3
Ken Thomases 31 Мар 2019 в 03:30