GLSL着色器算法优化

问题描述 投票:0回答:2

是否有办法优化下一个算法使其更快,即使只是小幅提高速度?

const mat3 factor = mat3(1.0, 1.0, 1.0, 2.112, 1.4, 0.0, 0.0, 2.18, -2.21);

vec3 calculate(in vec2 coord)
{
    vec3 sample;
    sample.x  = texture2D(texture_a, coord).r;
    sample.yz = texture2D(texture_b, coord).rb ;
    return (factor / sample) * 2.0;
} 
performance optimization glsl shader
2个回答
2
投票

我能想到的唯一重要的优化是将

texture_a
texture_b
打包到单个三通道纹理中(如果可以的话)。这可以为您节省两个纹理查找之一,这很可能是这里的瓶颈。


0
投票

@Thomas 的答案是最有帮助的,因为如果他的解决方案在您的应用程序中可行,则纹理查找是最昂贵的。如果您已经在其他地方使用这些纹理,最好将这些值作为参数传递,以避免重复查找。

否则我不知道它是否可以优化那么多,但我想到了一些直接的事情。

编译器优化:

将 const 关键字分配给 coord 参数,如果可能的话也进行采样。
在每个浮点元素中分配 f 文字。

也许手动分配垫子

我不知道它是否更快,因为我不知道矩阵乘法是如何实现的,但由于常数因子矩阵包含许多1和0,所以也许可以手动分配。

vec3 calculate(const in vec2 coord)
{
    //not 100% sure if that init is possible
    const vec3 sample = vec3(texture2D(texture_a, coord).r
        texture2D(texture_b, coord).ra - 0.5f);

    vec3 result = vec3(sample.y);
    result.x += sample.x + sample.z;
    result.y += 2.112f * sample.x;
    result.z *= 2.18f;
    result.z -= 2.21f * sample.z;

    return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.