优化片段着色器

Posted

技术标签:

【中文标题】优化片段着色器【英文标题】: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() 有助于提高性能吗?跨度> 【参考方案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 时。

以上是关于优化片段着色器的主要内容,如果未能解决你的问题,请参考以下文章

片段着色器是不是处理来自顶点着色器的所有像素?

顶点着色器+片段着色器

Shader2.0的顶点着色器和片段着色器

如果几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

OpenGL:为啥我不能将单个浮点数从顶点着色器传递到片段着色器?

损坏的顶点和片段着色器