Это один из тех вопросов "это зависит".
Высокоточные произвольные sin()
и cos()
, в частности, как правило, являются дорогостоящими операциями, поскольку они не часто используются непосредственно в графике, а получение полной точности, как правило, требует некоторого уровня итерации уточнения. Поэтому по отдельности меня не удивит, если текстурирование будет быстрее.
Несколько предостережений. Во-первых, в большинстве случаев использование косинуса для освещения основано на угле между векторами единичной длины, поэтому вам не нужно произвольное cos()
- просто используйте dot()
, для которого графические процессоры очень эффективны при.
Во-вторых, стоит отметить, что некоторые реализации (в частности, мобильные графические процессоры), вероятно, уже смогут дать вам более быстрые и менее точные результаты, если вы будете вычислять с точностью mediump
. Это уменьшит базовую стоимость для sin()
или cos()
в логи c ниже.
Остальная часть вопроса на самом деле заключается в том, лучше ли стоимость sin()
, чем стоимость texture()
, который, вероятно, очень сильно зависит от остальной части программы шейдера и баланса функциональных блоков в целевом графическом процессоре.
- Если в вашем шейдере уже преобладает производительность текстурирования из-за других не связанных Операции с текстурой, а затем добавление большего количества текстур сделает его медленнее, даже если отдельный вызов
texture()
индивидуально быстрее, чем sin()
. - Если в вашем шейдере преобладает арифметика c (или любые другие единицы) выполняет
sin()
вызовов), тогда производительность может улучшиться, перенеся некоторую нагрузку с этого на путь текстурирования.