我将计算着色器的结果存储在 MTLBuffer 中。MTLBuffer 的每个元素都是一个 UInt16。我试图将结果传递给片段着色器,该着色器通过将 MTLBuffer 的元素解释为 0 到 255 之间的颜色强度来显示结果。我使用以下代码从这个 MTLBuffer 创建一个 MTLTexture 并将纹理传递给着色器。但我认为在这个过程中有些地方是不正确的,因为输出不正确。我不确定这是否是像素格式和/或格式转换的问题。
let textureDescriptor = MTLTextureDescriptor()
textureDescriptor.textureType = .type2D
textureDescriptor.pixelFormat = .r16Uint
textureDescriptor.width = bufferWidth
textureDescriptor.height = 256
textureDescriptor.usage = [.shaderRead, .shaderWrite]
let texture = buffer?.makeTexture(descriptor: textureDescriptor, offset: 0, bytesPerRow: bufferWidth*MemoryLayout<UInt16>.stride)
这是片段着色器代码,
fragment half4 fragmentShaderDisplay (MappedVertex in [[ stage_in ]],
texture2d<ushort, access::sample> lumaTexture [[ texture(0) ]]
)
{
constexpr sampler s(t_address::clamp_to_edge, r_address::clamp_to_edge, min_filter::linear, mag_filter::linear);
float luma = lumaTexture.sample(s, in.textureCoordinate).r/255.0;
luma = clamp(0.0, luma, 1.0);
return half4(luma, luma, luma, 1.h);
}