Является ли iOS glGenerateMipmap синхронным или, возможно, асинхронным? - PullRequest
4 голосов
/ 15 марта 2012

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

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

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

Higher mipmap levels don't exist

Ответы [ 3 ]

3 голосов
/ 17 марта 2012

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

2 голосов
/ 16 марта 2012

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

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

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

1 голос
/ 16 марта 2012

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

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

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

...