使用 MTLPixelFormat.r32Float 采样纹理
Sampling texture with MTLPixelFormat.r32Float
我有一个带有 MTLPixelFormat.r32Float 的纹理,我想使用 texture.sample(mySampler, float2(u, v)) 通过线性插值对其进行采样。我将采样器配置为:
constexpr sampler mySampler (mag_filter::linear,
address::clamp_to_edge,
min_filter::linear);
但是,在金属着色器中,texture.sample() 总是 returns 一个 4 分量向量 (float4)。所以我的问题是:
- 采样器能否使用 MTLPixelFormat.r32Float 正确插入纹理?
- 如果是,采样器输出的哪个分量 (float4) 代表采样值?
到目前为止,我一直未能通过实验发现这一点。 None 示例输出的组件似乎有效。是否有可能我必须以不同方式配置采样?还是不可能?
具有 MTLPixelFormatR32Float 像素格式的纹理在大多数 GPU 上不能 filtered during sampling。
根据Metal Shader Language Specification:
For unspecified color components in a pixel format, the default values
are:
- zero, for components other than alpha.
- one, for the alpha component.
If so, which component of the sampler output (float4) represents the
sampled value?
您可以使用数组索引来访问向量分量:
float c = texture.sample(mySampler, float2(u, v))[0];
或混合:
float c = texture.sample(mySampler, float2(u, v)).r;
float c = texture.sample(mySampler, float2(u, v)).x;
我有一个带有 MTLPixelFormat.r32Float 的纹理,我想使用 texture.sample(mySampler, float2(u, v)) 通过线性插值对其进行采样。我将采样器配置为:
constexpr sampler mySampler (mag_filter::linear,
address::clamp_to_edge,
min_filter::linear);
但是,在金属着色器中,texture.sample() 总是 returns 一个 4 分量向量 (float4)。所以我的问题是:
- 采样器能否使用 MTLPixelFormat.r32Float 正确插入纹理?
- 如果是,采样器输出的哪个分量 (float4) 代表采样值?
到目前为止,我一直未能通过实验发现这一点。 None 示例输出的组件似乎有效。是否有可能我必须以不同方式配置采样?还是不可能?
具有 MTLPixelFormatR32Float 像素格式的纹理在大多数 GPU 上不能 filtered during sampling。
根据Metal Shader Language Specification:
For unspecified color components in a pixel format, the default values are:
- zero, for components other than alpha.
- one, for the alpha component.
If so, which component of the sampler output (float4) represents the sampled value?
您可以使用数组索引来访问向量分量:
float c = texture.sample(mySampler, float2(u, v))[0];
或混合:
float c = texture.sample(mySampler, float2(u, v)).r;
float c = texture.sample(mySampler, float2(u, v)).x;