我有一个非常基本的片段着色器,它接受如下定义的数组纹理数组:
fragment float4 shader(RasterizerData in [[ stage_in ]],
sampler sampler2d [[ sampler(0) ]],
const array<texture2d_array<half>, 5> textures [[ texture(0) ]]) {
return float4(textures[in.textureIndex].sample(sampler2d, in.textureCoordinate, in.textureSlice));
}
我想向此着色器传递可变数量的纹理。每个纹理是一个阵列纹理,每个阵列纹理是不同的大小。 (因此,为什么我不能只传递单个数组纹理。)
在上面的代码中,由于我通常只有1个纹理,因此我将数组大小任意定义为5
。如果我的纹理少于5个,则片段索引未在我的应用程序代码中设置。
我的应用代码与此类似:
for (int i = 0; i < textures.size(); ++i) {
[renderEncoder setFragmentTexture:textures[i] atIndex:i];
}
数组大小为5
时,性能很好。但是,如果我所做的唯一更改是在着色器中将数组的大小重新定义为64
,则总体渲染性能将直线下降。没有其他更改,这意味着大多数片段纹理索引都未设置。
为什么这种变化会对性能产生如此大的影响?
GPU调试器显示大部分时间都花在了我的渲染编码器的drawIndexedPrimitives
上。 (24.04 ms)当我声明一个较小的数组大小时,我可以轻松实现60fps。
在macOS 10.14上,MacBook Pro 13“ TB 2016。