将像素数据写入 texture2d 的某个 mipmap 级别

Write pixel data to certain mipmap level of texture2d

如您所知,Metal Shading Language 允许在内核函数中从 texture2d 读取像素数据的几种方法。它可以是简单的 read(short2 coord)sample(float2 coord, [different additional parameters])。但是我注意到,在将某些东西写入纹理时,只有 write 方法。

这里的问题是 sample 方法允许从某个 mipmap 级别进行采样,这非常方便。开发人员只需要使用 mipFilter 创建一个采样器并使用归一化坐标。

但是如果我想写入到某个mipmap级别的纹理怎么办?问题是 write 方法不像 sample 方法那样有 mipmap 参数,我找不到任何替代方法。

我很确定应该有一种方法可以选择 mipmap 级别来将数据写入纹理,因为 Metal Performance Shaders 框架具有填充纹理 mipmap 的解决方案。

提前致谢!

您可以使用 纹理视图

纹理视图的目的是通过选择其级别和切片的子集以及可能 reading/writing 不同(但兼容)像素格式的像素来重新解释基础纹理的内容。

MTLTexture 协议上的 -newTextureViewWithPixelFormat:textureType:levels:slices: 方法 returns id<MTLTexture> 的新实例,其具有 levels 范围中指定的第一个级别作为其基本 mip 级别。通过为您希望写入的每个 mip 级别创建一个视图,您可以 "target" 原始纹理中的每个级别。

例如,要在二维纹理的第二个 mip 级别上创建纹理视图,您可以这样调用方法:

id<MTLTexture> viewTexture = 
    [baseTexture newTextureViewWithPixelFormat:baseTexture.pixelFormat
                                   textureType:baseTexture.textureType
                                        levels:NSMakeRange(1, 1)
                                        slices:NSMakeRange(0, 1)];

将此新纹理绑定为参数时,其 mip 级别 0 将对应于其基础纹理的 mip 级别 1。因此,您可以在着色器中使用普通纹理 write 函数来写入选定的 mip 级别:

myShaderTexture.write(color, coords);