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

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

但是,如果我想写入纹理的特定mipmap级别怎么办?事实是,write方法没有mipmap方法具有的sample参数,因此我找不到任何替代方法。

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

提前致谢!

最佳答案

您可以使用纹理视图执行此操作。

纹理视图的目的是通过选择其级别和切片的子集并潜在地以不同(但兼容)的像素格式读取/写入其像素来重新解释基本纹理的内容。

-newTextureViewWithPixelFormat:textureType:levels:slices:协议上的MTLTexture方法返回id<MTLTexture>的新实例,该实例具有在levels范围内指定的第一级作为其基本mip级别。通过为每个要写入的Mip级别创建一个视图,可以“定位”原始纹理中的每个级别。

例如,要在2D纹理的第二个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);

关于ios - 将像素数据写入特定的mipmap级别的texture2d,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59290560/

10-15 05:01