2012-05-06 4 views
0

Есть ли способ оптимизировать следующий алгоритм быстрее, даже если это небольшое увеличение скорости?Оптимизация алгоритма шейдеров GLSL

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; 
} 

ответ

2

Единственная существенная оптимизацией я могу думать о том, чтобы упаковать texture_a и texture_b в одну текстуру три канала, если вы можете. Это экономит вам один из двух текстурных поисков, которые, скорее всего, будут узким местом здесь.

0

@ Ответ на ТОМАМ является наиболее полезным, так как поиск текстур является самым дорогостоящим, если его решение возможно в вашем приложении. Если вы уже используете эти текстуры где-нибудь еще, лучше передавайте значения в качестве параметров, чтобы избежать дублирования поиска.

Else Я не знаю, можно ли это оптимизировать так много, но некоторые прямые вещи, которые приходят мне на ум.

Оптимизация компилятора:

Присвоить сопзЬ ключевое слово коорд параметр, если можно попробовать тоже.
Назначьте литерал f в каждом поплавком элементе.

Может вручную назначить мат

Я не знаю, если его быстрее, потому что я не знаю, как реализуется матрица умножения, но так как постоянная матрица фактор содержит множество единиц и нулей это может быть, может быть вручную назначены.

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; 
} 
Смежные вопросы