gpt4 book ai didi

ios - 将一组纹理发送到 Metal 的最佳方式

转载 作者:行者123 更新时间:2023-12-01 18:53:06 26 4
gpt4 key购买 nike

我有下面的着色器(为了长度和清晰度而删除了部分),我想找到一个更好的方法来做到这一点。我想将一组大小可变的纹理发送到我的 Metal 着色器。我将对顶点位置进行一些计算,然后找出要使用的纹理。

目前我只是硬编码一些东西并使用了几个 if 语句,但这很丑陋(我猜速度不快)。有什么方法可以计算 i 然后将 i 用作纹理下标(如 tex[i].sample)?

// Current code - its ugly
fragment half4 SimpleTextureFragment(VertextOut inFrag [[stage_in]],
texture2d<half> tex0 [[ texture(0) ]]
texture2d<half> tex1 [[ texture(1) ]]
texture2d<half> tex2 [[ texture(2) ]]
...
texture2d<half> texN [[ texture(N) ]]
)
{
constexpr sampler quad_sampler;
int i = (Compute_Correct_Texture_to_Use);
if(i==0)
{
half4 color = tex0.sample(quad_sampler, inFrag.tex_coord);
}
else if(i==1)
{
half4 color = tex1.sample(quad_sampler, inFrag.tex_coord);
}
...
else if(i==n)
{
half4 color = texN.sample(quad_sampler, inFrag.tex_coord);
}
return color;
}

最佳答案

你是对的,你的方法不会很快。最好的情况,着色器会有很多分支(这不好),更坏的情况,着色器实际上会从你的所有纹理中采样,然后丢弃它不使用的结果(这会更慢)。

这不是 GPU 处理得特别好的情况,所以我的建议是稍微重构您的方法,使其对 GPU 更加友好。在不了解您在更高层次上所做的事情的情况下,我的第一个建议是考虑使用 2d 数组纹理

2d 数组纹理本质上是将 X 个 2D 纹理合并到一个带有 X 个切片的纹理中。您只需将单个纹理传递给 Metal,您就可以计算出在着色器中从哪个切片中进行采样,就像您已经在做的那样,但是通过这种方法,您将摆脱所有“if”分支,只需要调用像这样采样一次:tex.sample( my_sampler, inFrag.tex_coord, i );

如果您的纹理都是相同的大小和格式,那么这将很容易工作。您只需将每个 2D 纹理复制到数组纹理的一部分中。如果您的纹理大小或格式不同,您可能需要通过拉伸(stretch)一些纹理来解决这个问题,以便它们最终都具有相同的尺寸。

请参阅此处获取文档:https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Mem-Obj/Mem-Obj.html#//apple_ref/doc/uid/TP40014221-CH4-SW10(寻找“纹理切片”)

也在这里:https://developer.apple.com/library/prerelease/ios/documentation/Metal/Reference/MTLTexture_Ref/index.html#//apple_ref/c/econst/MTLTextureType2DArray

Metal 着色器语言文档在这里:https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/std-lib/std-lib.html#//apple_ref/doc/uid/TP40014364-CH5-SW17 (寻找“二维纹理阵列”)

关于ios - 将一组纹理发送到 Metal 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661669/

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