将像素数据写入 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);
如您所知,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);