2014-01-07 1 views
6

Doing некоторых исследований методов сглаживания, я наткнулся на этом куске кода (схваченный от FXAA затенения от Nvidia):GLSL/HLSL - Несколько однолинейные условные операторы в отличии от одного блока

if(!pairN) lumaN = lumaS; 
if(!pairN) gradientN = gradientS; 
if(!pairN) lengthSign *= -1.0; 

Есть хороший Причина, по которой это не написано вместо следующего?

if (!pairN) { 
    lumaN = lumaS; 
    gradientN = gradientS; 
    lengthSign *= -1.0; 
} 

Я предполагаю, что это какая-то оптимизация? Просто кажется, на самом деле противоречит здравому смыслу ...

ответ

5

Это тривиально для GLSL компилятора для преобразования этого кода:

if(!pairN) lumaN = lumaS; 
if(!pairN) gradientN = gradientS; 
if(!pairN) lengthSign *= -1.0; 

в этом внеофисном код:

lumaN = pair ? lumaN : lumaS; 
gradientN = pair ? gradientN : gradientS; 
lengthSign *= pair ? 1.0 : -1.0; 

Это внеофисное в том смысле, оно может выражаться следующим образом:

float a = float(pair); 
float b = 1.0 - a; 
lumaN = a * lumaN + b * lumaS; 
gradientN = a * gradientN + b * gradientS; 
lengthSign *= a * 1.0 + b * -1.0; 

Это несколько эффективная оптимизация на мобильных GPU.

Автоматическая оптимизация всего блока if не такая уж тривиальная.

+0

Могут ли современные компиляторы GPU не оптимизировать интуитивно понятную версию? – skiwi

+0

Похоже, что они не могут оптимизировать большой блок '' if''. –

+0

@skiwi Если это одна вещь, которую я узнал о реализации GLSL на протяжении многих лет ... компилятор делает много неожиданных вещей. Некоторые соображения оптимизируют мой разум, и другие, с которыми я едва могу поверить, были упущены. Попытка в обоих направлениях и просмотр промежуточного результата с помощью 'glGetProgramBinary' так же хороши, как вы можете получить. – jozxyqk

 Смежные вопросы

  • Нет связанных вопросов^_^