Производительность 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, как правило, будет работать лучше.