OpenGL, плохие неиспользуемые карты теней в шейдере? - PullRequest
0 голосов
/ 04 сентября 2018

Это плохая идея иметь что-то подобное в своем коде шейдера?

uniform sampler2DShadow shadowMaps[8];
uniform int numShadowMaps;

С этим можно получить универсальный шейдер, который работает для всех случаев от 0 до 8 карт теней. Или для производительности лучше иметь 8 разных шейдеров с жестко закодированными числами карты теней?

1 Ответ

0 голосов
/ 04 сентября 2018

На самом деле проблема не столько в производительности, сколько в том, что нужно взять столько точек привязки. Во многих реализациях допускается только 16 точек привязки текстуры (для каждой стадии шейдера), поэтому вы использовали бы половину из них только для теней. Даже если они не используются, они все равно занимают эти ресурсы.

Было бы лучше использовать сэмплер карты теней текстуры 2D-массива (sampler2DArrayShadow). У вас все равно будет униформа, сообщающая, сколько слоев массива заполнено полезными данными.

Кроме того, таким образом вы не жестко запрограммируете ограничение в своем шейдере. Поэтому, если вы решите, что верхний предел карт теней составляет всего 6 или его следует увеличить до 10, вам не нужно менять код шейдера.

Недостатком, конечно, является то, что все слои текстуры массива должны быть одинакового размера. Поэтому, если вам нужно, чтобы некоторые из ваших карт теней были меньше, вы не сможете этого сделать.

...