您可能知道,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/