金属:写入纹理并在不调用endEncoding的情况下读取它

时间:2019-08-26 19:57:42

标签: ios metal

问题:我在曲面( S0 )上绘制了一些形状,我想使用一个新的Surface( S1 ),在S1上渲染了一些带有alpha的形状,最后将它们合成到S0。

解决方案:一个简单的解决方案是:

  1. 创建一个id<MTLTexture> t1,将其设置为MTLRenderCommandEncoder r1的颜色附件,以创建S0。
  2. 绘制所有必须在S0上绘制的形状。
  3. endEncoding上调用r1并创建一个新的id<MTLTexture> t2,并将其设置为MTLRenderCommandEncoder r2的颜色附件,以创建S1。
  4. 绘制所有要在S1上绘制的形状。致电endEncoding上的r2
  5. 再次创建一个新的MTLRenderCommandEncoder r3,这次将颜色附加为t1,并在t2上绘制t1的内容。
  6. 最后,致电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];

0 个答案:

没有答案