Производительность glsl: tan(acos(x)) против sqrt(1-x*x)/x

Я пишу фрагментный шейдер glsl, в котором я использую отображение теней. Следуя этому руководству http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/, я написал эту строку, чтобы оценить смещение shaodw, чтобы избежать теневых угрей

float bias = 0.005 * tan( acos ( N_L_dot ) );

Но я знаю из математики, что

tan ( acos ( x ) = sqrt ( 1 - x^2 ) / x

Было бы быстрее использовать такую ​​идентичность вместо загара и acos? На практике, чтобы использовать эту строку кода

float bias = 0.005 * sqrt ( 1.f - N_L_dot * N_L_dot   ) / N_L_dot ;

Я думаю, что мой вопрос что-то вроде: "GPU быстрее при выполнении sqrt и делений или tan и acos?" ... или я что-то упустил?

1 ответ

Решение

Использование AMD GPU Shader Analyzer показало, что float bias = 0.005 * sqrt ( 1.f - N_L_dot * N_L_dot ) / N_L_dot ;Будет генерировать меньше инструкций тактового цикла в сборке шейдера ( 4 инструкции, оценивающие 4 тактовых цикла).

Где float bias = 0.005 * tan( acos ( N_L_dot ) ); сгенерировал 15 инструкций, оценивая 8 тактов для завершения.

Я использовал два разных метода для кода сборки Radeon HD 6450. Но результаты, похоже, хорошо прослеживаются для разных карт Radeon HD.

Похоже, что метод sqrt, как правило, будет работать лучше.

Другие вопросы по тегам