缓存和纹理操作:位图 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

MTLBlitCommandEncodergenerateMipmapsForTexture: 方法将为给定的纹理自动生成 mipmaps (以纹理图像作为基层数据)。generateMipmapsForTexture: 创建 mipmap 各个层级的缩放过得图像直到最高层(一个像素)。

更多关于 mipmap 的层数和每层图像大小如何确定的内容,详见: Slices.

为一个缓存填充内容

MTLBlitCommandEncoder 对象的 fillBuffer:range:value: 方法将为一个给定的缓存对象的设定区域的每个字节填充一个 8-bit 的常量值。

位图 Command Encoder 结束编码

一个位图 Command Encoder 要完成指令编码,需要调用 endEncoding 方法。对于一个 command buffer,当前一个 Encoder 完成后,才可以创建任意类型新的 Encoder 编码更多的指令到 command buffer。

results matching ""

    No results matching ""