【问题标题】:Optimize Fragment Shader优化片段着色器
【发布时间】:2019-03-04 01:24:05
【问题描述】:

我想优化片段着色器的性能。目前我的片段着色器是

fragment half4 fragmen_shader_texture(VertexOutTexture vIn [[stage_in]],
                                       texture2d<half> texture [[texture(0)]]){

    constexpr sampler defaultSampler;

    half4 color =  half4(texture.sample(defaultSampler, vIn.textureCoordinates));


    return color;
}

这个任务是返回纹理颜色。无论如何要优化更多。

【问题讨论】:

  • 如果您不采样以以不同的纹理大小进行渲染,使用计算着色器(仅限 A8 或更新的设备)并调用 read() 而不是 sample() 有助于提高性能吗?跨度>

标签: ios metal metalkit


【解决方案1】:

没有用于优化片段着色器 AFAICT 的选项,它除了对纹理进行采样之外几乎什么都不做。但是,根据您的情况,仍有可能通过以下方式进行优化:

  • 通过使用更紧凑的纹理格式(565 或 4444 而不是 8888,或者更好的 4 位或 2 位 PVRTC)来减少带宽使用。
  • 如果不需要 Alpha 混合,请确保禁用 Alpha 混合。
  • 如果纹理有很多“空白空间”(例如,考虑具有中心圆形斑点和空白角的粒子纹理),那么您可以通过将其渲染为八边形而不是四边形来确保几何图形更紧密地适合它实例。
  • 如果有可能最小化图像,请启用 mipmapping。禁用更昂贵的 mipmapping 选项,例如三线性/各向异性过滤。

【讨论】:

  • 减少纹理带宽。我正在使用 kCVPixelFormatType_32BGRA。对我来说,Alpha 信息很重要。我可以使用什么纹理格式进行优化。由于 Alpha 很重要,因此无法禁用 Alpha 混合。
  • 4444 是 16bpp 格式,带有 alpha 通道,而 PVRTC 4bpp/2bpp 可以有 alpha 通道。不过,您可能会注意到精度降低,尤其是在处理 2D 而不是 3D 时。
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2021-10-06
相关资源
最近更新 更多