Принимая решение о месте выполнения вычислений, нужно определить узкие места программного обеспечения для конкретной операции рендеринга. Сначала нужно ускорять самую медленную часть системы. Не стоит тратить время на улучшение производительности не в узких местах, так как все равно выигрыша не будет.
8.2.2. Анализ алгоритма Если разобраться в математике алгоритма, использующегося в шейдере, можно сделать этот шейдер более эффективным. Например, пусть нужно приводить любое значение переменной fi паї col or к диапазону [0, 1]. Зная, что значение этой переменной может быть только больше 0, можно не проверять fi паї col or на отрицательные значения. Команда mi n(f і паї col or, 1.0) всегда приведет результат к 1,0, поэтому она гораздо более эффективна, чем cl amp ( fi паї col or, 0.0,1.0 ), так как число нужно сравнивать только с одним значением, а не с двумя. Если для каждой пере-1 менной в шейдере определить диапазон допустимых значений, будет легче выявлять возможности оптимизации.
8.2.3. Использование встроенных функций Встроенные функции лучше использовать везде, где только возможно, - это поможет повысить производительность. Встроенные функции реализованы производителем аппаратного обеспечения, и обычно они работают быстрее, чем те же вычисления в обычном коде. Если вычисления в шейдере все-таки сделаны вручную, без использования встроенных функций, вероятность того, что код будет работать быстрее, довольно мал, а ухудшить производительность вполне реально.
8.2.4. Использование векторов Язык шейдеров OpenGL позволяет выполнять операции с векторами простыми и естественными способами, а графическое аппаратное обеспечение обычно спроектировано так, что может работать одновременно со всеми значениями вектора. Так что следует пользоваться этим преимуществом и применять векторы в вычислениях везде, где это возможно. С другой стороны, не следует использовать векторы, большие размером, чем того требуют вычисления. Это влечет за собой ненужный расход регистров, аппаратных интерполяторов (в случае varying-nepe-менных), уменьшает пропускную способность процессора и занимает память.