Система: Android 4.03, OpenGL ES 2.0
Проблема: когда glAttachShader вызывается после того, как первый кадр уже был обработан другой программой/шейдером, некоторые устройства (Galaxy S3) аварийно завершают работу с ошибкой "GL_INVALID_VALUE" (дополнительные сведения в стеке ошибок отсутствуют). ). Другие устройства (Asus eee TF101) прекрасно с этим справляются. Ошибка возникает не всегда, а иногда это также «GL_INVALID_ENUM». Если я принудительно компилирую все шейдеры сразу при первом вызове onDrawFrame, он работает на всех (моих) устройствах.
Вопросы. Существуют ли состояния, в которых машина openGL(ES) не может скомпилировать шейдер? Возможно ли, что связанные буферы, текстуры или активные массивы атрибутов мешают присоединению шейдера к программе? Если да, то какое идеальное состояние необходимо обеспечить перед подключением шейдеров и компоновкой программы? Можно ли вообще компилировать шейдеры после того, как другие объекты уже были обработаны другими шейдерами?
Предыстория: я разрабатываю библиотеку для Android, которая позволит мне использовать графику openGL более объектно-ориентированным способом (используя такие объекты, как «сцена», «материал», «модель» и т. д.), максимально легко писать игры. Сцены, модели и т. д. создаются в потоке, отличном от контекста GL. Только когда onDrawFrame встречает один из этих объектов, он выполняет привязку объекта буфера, привязку текстуры и компиляцию шейдера в правильном потоке. Я хотел бы избежать компиляции всех шейдеров в начале моего кода. Исходный код шейдера собирается в зависимости от требований материала, модели и сцены (например: Материал: включить бамп-мэппинг, Модель: включить матричный-палитровый скимминг, сцена: включить туман). Когда модель удаляется из сцены, я снова удаляю шейдер, а если я добавляю другую модель, новый шейдер должен быть скомпилирован ad-hoc.
На этом этапе я стараюсь быть максимально кратким, не публикуя код — вы можете себе представить, как сложно извлечь соответствующие части из этой библиотеки.