Подтвердить что ты не робот

ПРЕДУПРЕЖДЕНИЕ: вывод вершинного шейдера 'v_gradient' не читается фрагментарным шейдером

Когда я запускаю свое приложение в ios 10 с помощью xcode 8, я получаю следующее сообщение в консоли отладки и пользовательский интерфейс, зависающий, может ли кто-нибудь знать, почему это происходит.

 ERROR
 /BuildRoot/Library/Caches/com.apple.xbs/Sources/VectorKit/VectorKit-1228.30.7.17.9/GeoGL/GeoGL/GLCoreContext.cpp
 1763: InfoLog SolidRibbonShader: ERROR
 /BuildRoot/Library/Caches/com.apple.xbs/Sources/VectorKit/VectorKit-1228.30.7.17.9/GeoGL/GeoGL/GLCoreContext.cpp
 1764: WARNING: Output of vertex shader 'v_gradient' not read by
 fragment shader
4b9b3361

Ответ 1

Ответ

Одна из ситуаций, когда вы можете получить это предупреждение в Xcode, - это использование приложения, использующего шейдеры, такие как приложение "Карты", с MKMapView. Вы обнаружите, что отображение карты работает так, как ожидалось, без этого предупреждения на реальном устройстве с реальной аппаратной/собственной ОС.

В симе шейдер SolidRibbonShader не способен читать вывод вершинного шейдера v_gradient либо потому, что он является ошибкой бета-версии или выпуском Xcode. Однако шейдеры распознаются на реальном устройстве.

Объяснение

Эти шейдеры относятся к OpenGL Rendering Pipeline. Rendering Pipeline - это последовательность шагов, которые выполняет OpenGL при рендеринге объектов.

Конвейер рендеринга отвечает за такие вещи, как применение текстуры, преобразование вершин в правильную систему координат и отображение символа на экране и т.д.

В этом конвейере есть шесть этапов.

  • Операция на вершине.
  • Примитивное собрание
  • Примитивная обработка
  • растеризации
  • Обработка фрагментов
  • Работа с фрагментами

Наконец, изображение появляется на экране вашего устройства. Эти шесть этапов называются OpenGL Rendering Pipeline, и все данные, используемые для рендеринга, должны пройти через него.

Что такое шейдер?

Шейдер - небольшая программа, разработанная вами, которая живет в GPU. Шейдер написан на специальном графическом языке под названием OpenGL Shading Language (GLSL).

Шейдер заменяет два важных этапа в OpenGL Rendering Pipeline: Per-Vertex Processing и Per-Fragment Processing. Для каждого из этих двух этапов есть один шейдер.

Конечной целью Vertex Shader является предоставление окончательного преобразования вершин сетки в конвейер рендеринга. Целью Fragment shader является предоставление данных Coloring and Texture для каждого заголовка пикселя в фреймбуфере.

Vertex shaders преобразовать вершины треугольника из локальной системы координат модели в положение экрана. Fragment shaders вычислить цвет пикселя внутри растрового треугольника на экране.

Раздельная компоновка и привязка скорости шейдерных объектов

Многие приложения OpenGL ES используют несколько шейдеров вершин и фрагментов, и часто бывает полезно повторно использовать один и тот же шейдер фрагментов с разными шейдерами вершин или наоборот. Поскольку основная спецификация OpenGL ES требует связывания вершин и фрагментов, которые должны быть связаны друг с другом в одной программе шейдеров, смешивание и сопоставление шейдеров приводит к большому количеству программ, что увеличивает общее количество шейдеров и время связывания при инициализации вашего приложения.

Ответ 2

Обновление: проблема теперь исчезла на Xcode9/iOS11.


Во-первых, проблема с замораживанием происходит только при запуске от Xcode 8 и только на iOS 10 (в настоящее время 10.0.2), будь то в режиме отладки или выпуска. MKMapView хотя кажется прекрасным, когда приложение распространяется через App Store или сторонние системы распространения ad hoc. Предупреждения, которые вы видите, могут или не могут быть связаны с проблемой, я не знаю.

Что я нашел, так это то, что код нарушения находится в деструкторе MKMapView, и не имеет значения, что вы делаете с объектом просмотра карты или как его настроить, т.е. просто вызывая

[MKMapView new];

в любом месте вашего кода будет заморожено приложение. Основная нить висит на семафоре, и непонятно почему.

Одна из вещей, которую я пробовал, - это уничтожить объект просмотра карты в отдельном потоке, но это не помогло. В конце концов я решил сохранить мои объекты карты, по крайней мере, в сборках DEBUG.

ПРИМЕЧАНИЕ: это обходное решение sh * tty, но по крайней мере это поможет вам отлаживать ваше приложение без зависания. Сохранение этих объектов означает, что ваше использование памяти будет расти примерно на 45-50 МБ каждый раз при создании контроллера вида с картой.

Итак, скажем, если у вас есть свойство mapView, вы можете сделать это в своем диспетчере просмотра dealloc:

- (void)dealloc
{
#if DEBUG
    // Xcode8/iOS10 MKMapView bug workaround
    static NSMutableArray* unusedObjects;
    if (!unusedObjects)
        unusedObjects = [NSMutableArray new];
    [unusedObjects addObject:_mapView];
#endif
}