Металлическая текстура - нарисуй и сотри - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь изменить образец Apple GLPaint (приложение для рисования, использующее OpenGL), чтобы использовать Metal вместо OpenGL. Я могу отрисовать мазок кисти на экране с помощью металла, но у меня возникают трудности при его "удалении".

В металле я использую следующие параметры смешивания:

renderPipelineDescriptor.colorAttachments[0].isBlendingEnabled = true
renderPipelineDescriptor.colorAttachments[0].rgbBlendOperation = .add
renderPipelineDescriptor.colorAttachments[0].alphaBlendOperation = .add
renderPipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .one
renderPipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .one
renderPipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
renderPipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

Функция рендеринга использует описанный выше дескриптор конвейера:

let descriptor = MTLRenderPassDescriptor()

descriptor.colorAttachments[0].loadAction = .load
descriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha:0.0)
descriptor.colorAttachments[0].storeAction = .store
descriptor.colorAttachments[0].texture = colorAttachmentTexture

let renderCommandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: descriptor)
renderCommandEncoder?.setRenderPipelineState( blendRGBAndAlphaPipelineState)
    texturedQuad.encodeDrawCommands(encoder: renderCommandEncoder!, texture: texture)
    renderCommandEncoder?.endEncoding()

Как я могу создать дескриптор конвейера, чтобы "стереть" части ранее обработанной текстуры? В OpenGL я мог переключаться между «рисованием» и «стиранием», выполнив следующее:

if(eraserEnabled)
{
    glColor4f(0,0,0,1);
    glBlendFunc( GL_ZERO,GL_ONE_MINUS_SRC_ALPHA);
}
else
{

    // Set color of the brush 
    glColor4f(1,0,0,1);
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}

Я попытался создать второй рендер-конвейер в металле, который используется для «стирания». Я использовал параметры смешивания ниже, но он не работает.

renderPipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = .zero
renderPipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = .zero
renderPipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
renderPipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

image shows how

Резюме: я рендеринг текстуры металла на экран, но не сейчас, как установить параметры смешивания, "стереть" выделенные области ранее нарисованной текстуры.

1 Ответ

0 голосов
/ 14 марта 2019

Я установил только этот sourceAlphaBlendFactor = .zero, без sourceRGBBlendFactor.Например, я использовал код из https://github.com/codelynx/MetalPaint

...