问题:我在曲面( S0 )上绘制了一些形状,我想使用一个新的Surface( S1 ),在S1上渲染了一些带有alpha的形状,最后将它们合成到S0。
解决方案:一个简单的解决方案是:
id<MTLTexture> t1
,将其设置为MTLRenderCommandEncoder r1
的颜色附件,以创建S0。endEncoding
上调用r1
并创建一个新的id<MTLTexture> t2
,并将其设置为MTLRenderCommandEncoder r2
的颜色附件,以创建S1。endEncoding
上的r2
。MTLRenderCommandEncoder r3
,这次将颜色附加为t1
,并在t2
上绘制t1
的内容。endEncoding
。如您所见,我不得不打电话给endEncoding
3次。从我的经验来看,您的代码中使用的MTLRenderCommandEncoder
越多,性能就越差。
是:有什么办法可以改善此效果?还是减少endEncoding
的数量以获得更好的性能?
这就是我创建MTLRenderCommandEncoder
的方式:
MTLRenderPassDescriptor* renderPassDescriptor = [MTLRenderPassDescriptor renderPassDescriptor];
renderPassDescriptor.colorAttachments[0].texture = texture // (an id<MTLTexture>)
descriptor.storeAction = MTLStoreActionStore;
descriptor.loadAction = MTLLoadActionLoad;
descriptor.clearColor = clearColor; // MTLClearColor
然后使用以下方法创建编码器:
renderEncoder = [_commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];