В реализациях OpenGL ES 2.0 обычно есть максимальное количество поддерживаемых инструкций, но API не требует минимального количества, так как это нецелесообразно.Реализация Nvidia Tegra компилирует источник в 532 инструкции, что превышает его максимальный предел.Единственная возможность (кроме изменения реализации OpenGL ES 2.0) - переписать шейдер, чтобы его можно было скомпилировать с меньшим количеством инструкций.
Не зная подробностей реализации Nvidia, оператор наподобие working_float = charsequence_6[uniform_reference -20][uniform_reference_sub_item];
, в сочетании с ветвлением, в конечном итоге приводит к нескольким инструкциям (у вас есть вычитание, загрузка, сохранение и индексация массива).В целом ветвление часто проблематично, так как компилятор может не иметь возможности компилировать несколько инструкций для параллельного выполнения из-за разных потоков кода.
Ваш if - else if - else, если код довольно легко переписать, чтобыон может быть скомпилирован с меньшим количеством инструкций, но при этом имеет то же значение:
if(uniform_reference < 4) {
working_float = charsequence_1[uniform_reference][uniform_reference_sub_item];
} else if(uniform_reference < 8) {
working_float = charsequence_2[uniform_reference - 4][uniform_reference_sub_item];
} else if(uniform_reference < 12) {
working_float = charsequence_3[uniform_reference - 8][uniform_reference_sub_item];
} else if(uniform_reference < 16) {
working_float = charsequence_4[uniform_reference -12][uniform_reference_sub_item];
} else if(uniform_reference < 20) {
working_float = charsequence_5[uniform_reference -16][uniform_reference_sub_item];
} else if(uniform_reference < 24) {
working_float = charsequence_6[uniform_reference -20][uniform_reference_sub_item];
}
Это может уже соответствовать пределу 256 инструкций.(В коде шейдера простое правило состоит в том, что зачастую размер кода GLSL просто определяет количество инструкций.) Если нет, то кажется, что вы можете заменить uniform_reference - {4,8,etc}
на uniform_reference_sub_item
, поскольку этов любом случае то же значение;это также сохранит несколько инструкций.В конечном счете, вы можете поместить значения charsequence_ [123456] в массив и проиндексировать его на основе shape_reference, деленного на константу, а также на последовательность символов, чтобы в итоге получилось что-то вроде этого:
working_float = charsequence[uniform_reference / 4][uniform_reference - uniform_reference_sub_item][uniform_reference_sub_item];
Возможно, вы также можете объединить два массива, индексированных uniform_reference
и uniform_reference_sub_item
, чтобы избавиться и от одного уровня индексации.