Я пытаюсь реализовать два отличных CAMetalLayers
и использовать один MTLRenderCommandEncoder
для рендеринга той же сцены на оба слоя (металл для OS X).Несколько целей рендеринга в металле
Для этой цели я попытался создать один MTLRenderPassDescriptor
и прикреплять текстуры двух слоев к своим цветным вложениям. Мой метод отрисовки выглядит следующим образом:
- (void)render {
dispatch_semaphore_wait(_inflight_semaphore, DISPATCH_TIME_FOREVER);
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
__block dispatch_semaphore_t block_sema = _inflight_semaphore;
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> buffer) {
dispatch_semaphore_signal(block_sema);
}];
MTLRenderPassDescriptor *renderPass = [MTLRenderPassDescriptor renderPassDescriptor];
for (int i = 0; i < [_metalLayers count]; i++) {
_metalDrawables[i] = [_metalLayers[i] nextDrawable];
renderPass.colorAttachments[i].texture = _metalDrawables[[_metalDrawables count] - 1].texture;
renderPass.colorAttachments[i].clearColor = MTLClearColorMake(0.5, 0.5, (float)i/(float)[_metalLayers count], 1);
renderPass.colorAttachments[i].storeAction = MTLStoreActionStore;
renderPass.colorAttachments[i].loadAction = MTLLoadActionClear;
}
id<MTLRenderCommandEncoder> commandEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPass];
[commandEncoder setRenderPipelineState:_pipeline];
[commandEncoder setVertexBuffer:_positionBuffer offset:0 atIndex:0 ];
[commandEncoder setVertexBuffer:_colorBuffer offset:0 atIndex:1 ];
[commandEncoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:3 instanceCount:1];
[commandEncoder endEncoding];
for (int i = 0; i < [_metalDrawables count]; i++) {
[commandBuffer presentDrawable:_metalDrawables[i]];
}
[commandBuffer commit];
}
Однако сцена визуализируется лишь на один из слоев, оказывается, чтобы быть один, связанный с текстурой первого прикрепленного управления цветом. Другой слой очищается с указанным четким цветом, но ничего не рисуется.
Имеет ли подход какой-либо шанс преуспеть или использует цветные вложения дескриптора передачи визуализации, совершенно бессмысленные при попытке отобразить одну и ту же сцену на несколько экранов (то есть CAMetalLayers
)? Если да, есть ли другой возможный подход для достижения этого результата?
ли ваш фрагмент шейдера запись в более чем одном приложении цвета? Я бы посмотрел раздел ['Квалификаторы атрибутов для вывода функции фрагмента'] (https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/func-var-qual/func- var-qual.html # // apple_ref/doc/uid/TP40014364-CH4-SW12) и спецификатор '[[color (m)]]'. – lock
Вышеуказанный ответ правильный и что вам нужно. Если ваш шейдер не записывает несколько целей рендеринга, вы не увидите эти записи в ваших прикрепленных текстурах. – m3v3rik