For-loop в шейдерном коде, работающем с жестким кодом, но не с однородной переменной

Я попросил о помощи по проблеме OpenGL ES 2.0 в этом вопросе . Кажется, что ответ очень странный для меня. Поэтому я решил задать этот вопрос в надежде понять, что происходит.

Вот фрагмент ошибочного кода вершины-шейдера:

// a bunch of uniforms and stuff... uniform int u_lights_active; void main() { // some code... for ( int i = 0; i < u_lights_active; ++i ) { // do some stuff using u_lights_active } // some other code... } 

Я знаю, что это выглядит странно, но это действительно весь код, необходимый для объяснения проблемы / неправильного поведения.

Мой вопрос: почему цикл не выполняется, когда я передаю какое-то значение больше 0 для u_lights_active? Когда я жестко задаю целое число, например, 4, вместо использования равномерного u_lights_active, он работает нормально.

Еще одна вещь, это появляется только на Android, но не на рабочем столе. Я использую LibGDX для запуска того же кода на обеих платформах.

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

Я с нетерпением жду объяснения 🙂

Благодаря!

    В основном GLSL указывает, что реализации могут ограничивать циклы, чтобы иметь «постоянные» границы на них. Это упрощает оптимизацию кода для параллельной работы (различные подсчеты циклов для разных пикселей будут сложными). Я полагаю, что в некоторых реализациях константы даже должны быть маленькими. Обратите внимание, что спецификация просто определяет «минимальное» поведение, поэтому некоторые устройства могут поддерживать более сложные элементы управления контурами, чем требует спецификация.

    Вот краткий обзор ограничений: http://www.khronos.org/webgl/public-mailing-list/archives/1012/msg00063.html

    Вот спецификация GLSL (см. Раздел 4 Приложения A): http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

    http://www.opengl.org/discussion_boards/showthread.php/171437-can-for-loops-terminate-with-a-uniform

    http://www.opengl.org/discussion_boards/showthread.php/177051-GLSL-loop-problem-on-Radeon-HD-cards

    http://www.opengl.org/discussion_boards/showthread.php/162722-Problem-when-using-uniform-variable-as-a-loop-count-in-fragment-shader

    https://www.opengl.org/discussion_boards/showthread.php/162535-variable-controlled-for-loops

    Если у вас есть статический цикл, он может быть развернут и преобразован в статический постоянный поиск. Если вам абсолютно необходимо сделать его динамичным, вам нужно будет хранить индексированные данные в 1D текстуру и образец, которые вместо этого.

    Я предполагаю, что аппаратное обеспечение на рабочем столе более продвинуто, чем на планшете. Надеюсь это поможет!