gpt4 book ai didi

ios - 来自 MTLBuffer 问题的 MTLTexture

转载 作者:行者123 更新时间:2023-11-29 11:34:49 30 4
gpt4 key购买 nike

我将计算着色器的结果存储在 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);
}

最佳答案

您希望在什么意义上将缓冲区值解释为介于 0 和 255 之间?它们的固有范围是 0 到 65535,浮点组件的范围通常是 0.0 到 1.0。这些都不是 0 到 255。

如果您简单地除以 65535.0 而不是 255.0,您将得到您似乎想要的结果,一个介于 0.0 和 1.0 之间的值。

此外,您对 clamp() 的调用似乎有误。根据您编写的参数顺序,您将常量值 0.0 限制在 luma 和 1.0 之间。我认为您想将 luma 限制在 0.0 和 1.0 之间。

碰巧的是,您编写内容的方式大多会奏效。如果 luma 是 <= 0.0,则 0.0 将介于 luma 和 1.0 之间,并且将不加修改地返回。如果 0.0 <luma <= 1.0,则 0.0 低于范围,因此 clamp() 将返回范围的下限,即 luma。如果 luma > 1.0,问题就来了。在这种情况下,根据文档,clamp() 的结果是未定义的。

现在,如果您除以适当的除数,则不应出现大于 1.0 的值。事实上,根本不需要夹紧。

关于ios - 来自 MTLBuffer 问题的 MTLTexture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50319931/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com