Является ли iOS glGenerateMipmap синхронным или, возможно, асинхронным?

Я разрабатываю приложение для iPad, которое использует большие текстуры в OpenGL ES. Когда сцена впервые загружается, я получаю большой черный артефакт на потолке в течение нескольких кадров, как показано на рисунке ниже. Это как если бы более высокие уровни mipmap еще не были заполнены. На последующих кадрах потолок отображается правильно.

Эта проблема появилась только тогда, когда я начал использовать mipmapping. Одно из возможных объяснений состоит в том, что вызов glGenerateMipmap() выполняет свою работу асинхронно, порождая некоторого работника по созданию mipmap (в отдельном процессе или, возможно, в GPU) и возвращая его.

Это возможно, или я лаю не на том дереве?

Более высоких уровней MIPMAP не существует

3 ответа

В пределах одного контекста все операции будут выполняться строго по порядку. Однако в своем последнем ответе вы упомянули использование второй темы. Чтобы сделать это, вы должны создать второй общий контекст: всегда незаконно повторно входить в контекст OpenGL. Если уже используется общий контекст, есть еще некоторые правила синхронизации, которые вы должны соблюдать, задокументированные по адресу http://developer.apple.com/library/ios/ipad/#DOCUMENTATION/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithOpenGLESContexts/WorkingwithOpenGLESContexts.hl

Это должно быть синхронно; OpenGL сам по себе не имеет реальной концепции многопоточности (исключая неявный асинхронный диалог между CPU и GPU).

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

Второе предположение, основанное на выводе, было бы своего рода проблемой очистки буфера глубины.

Я последовал предложению @Tommy и переключился на GL_LINEAR_MIPMAP_LINEAR, Теперь эффект черного или правильного поменял цвет на правильный и черный.

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

Как только я подтвердил природу проблемы, я добавил glFinish() после загрузки всех моих текстур, и проблема исчезла. (Кстати, мой цикл отрисовки находится на переднем плане, а цикл загрузки текстур - потому что это занимает много времени и может ухудшить интерактивность - на заднем плане. Кроме того, поскольку это может варьироваться в зависимости от платформы, я использую iOS5 на iPad 2)

Другие вопросы по тегам