有没有一种方法可以优化下一个算法以使其更快,即使只是速度的小幅提升?
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 = texture2D(texture_a, coord).rgb;
return (factor / sample) * 2.15;
}
有没有一种方法可以优化下一个算法以使其更快,即使只是速度的小幅提升?
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 = texture2D(texture_a, coord).rgb;
return (factor / sample) * 2.15;
}
texture_a
如果可以的话,我能想到的唯一重要的优化是打包texture_b
成一个单一的三通道纹理。这为您节省了两个纹理查找之一,这很可能是这里的瓶颈。
@Thomas 的回答是最有帮助的,因为纹理查找是最昂贵的,如果他的解决方案在您的应用程序中是可能的。如果您已经在其他地方使用了这些纹理,则最好将这些值作为参数传递以避免重复查找。
否则我不知道它是否可以优化那么多,但我想到了一些直截了当的事情。
编译器优化:
如果可能,也将 const 关键字分配给坐标参数。
在每个浮点元素中分配 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;
}