缓存和纹理操作:位图 Command Encoder
MTLBlitCommandEncoder
提供方法用于在资源对象(缓存和纹理)间拷贝数据。数据拷贝操作对于图像处理或者纹理特效(比如模糊和反射)来说是必要的,它可以访问离屏渲染的图像数据。
为了执行数据拷贝操作,首先需要调用 MTLCommandBuffer
对象的 blitCommandEncoder
方法创建一个 MTLBlitCommandEncoder
对象。然后调用这个 MTLBlitCommandEncoder
对象的方法来编码指令推送给 command buffer。
在 GPU 内存中拷贝资源对象间的数据
下面的 MTLBlitCommandEncoder
方法在资源对象间拷贝图像数据:在两个缓存对象间,在两个纹理对象间,在一个缓存和一个纹理对象间。
在两个缓存对象间拷贝数据
copyFromBuffer:sourceOffset:toBuffer:destinationOffset:size:
该方法在两个缓存对象间拷贝数据,从源缓存对象到目标缓存对象 toBuffer
。如果源和目标是同一个缓存对象,并且拷贝区域的制定重合,那么结果是未知的。
从缓存对象拷贝数据到纹理对象
copyFromBuffer:sourceOffset:sourceBytesPerRow:sourceBytesPerImage:sourceSize:toTexture:destinationSlice:destinationLevel:destinationOrigin:
该方法从源缓存对象拷贝图像数据到目标纹理对象 toTexture
。
在两个纹理对象间拷贝数据
copyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toTexture:destinationSlice:destinationLevel:destinationOrigin:
该方法在两个纹理间拷贝某个区域的图像数据:从源纹理对象的一个单独的立方切片和 mipmap 层次向目标纹理对象 toTexture
做拷贝。
从一个纹理对象向一个缓冲对象拷贝数据
copyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toBuffer:destinationOffset:destinationBytesPerRow:destinationBytesPerImage:
该方法从作为源的纹理对象的一个单独立方切片和 mipmap 层次的某个区域向目标缓存对象 toBuffer
拷贝数据。
生成 Mipmaps
MTLBlitCommandEncoder
的 generateMipmapsForTexture:
方法将为给定的纹理自动生成 mipmaps (以纹理图像作为基层数据)。generateMipmapsForTexture:
创建 mipmap 各个层级的缩放过得图像直到最高层(一个像素)。
更多关于 mipmap 的层数和每层图像大小如何确定的内容,详见: Slices.
为一个缓存填充内容
MTLBlitCommandEncoder
对象的 fillBuffer:range:value:
方法将为一个给定的缓存对象的设定区域的每个字节填充一个 8-bit 的常量值。
位图 Command Encoder 结束编码
一个位图 Command Encoder 要完成指令编码,需要调用 endEncoding
方法。对于一个 command buffer,当前一个 Encoder 完成后,才可以创建任意类型新的 Encoder 编码更多的指令到 command buffer。