Запретить развертывание цикла в шейдерной программе при использовании ANGLE - PullRequest
0 голосов
/ 16 января 2019

В моем шейдере WEBGL я использую цикл неизвестной длины (при компиляции).

    do {
        sample = texture(uTex, posXY).a;
        accumulated += aSample * uAMultiplier;
    } while (accumulated < 0.8);

Это работает, как и ожидалось, в браузерах OpenGL, но по умолчанию windows chrome / ff использует угол, который развертывает циклы, что в данном случае невозможно, что приводит к ошибкам компиляции.

Ошибка: ошибка компиляции генерирует
Ошибка: не удается связать программу
Информационный журнал:
C: \ fakepath (110,28-106): ошибка X4014: невозможно выполнить операции градиента внутри циклов с управлением расходящимся расходом

C: \ fakepath (59,12-96): предупреждение X3570: инструкция градиента, используемая в цикле с изменяющейся итерацией, заставляющая цикл развернуться
C: \ fakepath (118,1-82): ошибка X3511: невозможно развернуть цикл, цикл не завершается своевременно (1024 итерации)

Есть ли решение для предотвращения развертывания или иного обхода при необходимости зацикливания?

1 Ответ

0 голосов
/ 16 января 2019

Вы можете попытаться объявить статический цикл с выходом. Например

float accumulated = 0.0;
#define ITERATION_LIMIT 100;
for (int i = 0; i < ITERATION_LIMIT; ++i) {
  sample = texture(uTex, posXY).a;
  accumulated += aSample * uAMultiplier;
  if (accumulated >= 0.8) {
    break;
  }
}

Конечно, лучше выбрать разумное число для лимита

...