Attention: sortie de vertex shader 'V gradient' non lue par fragment shader

quand j'exécute mon application dans ios 10 en utilisant xcode 8, je reçois un message de suivi dans la console de débogage, et en étant bloqué par L'interface utilisateur, tout le monde peut savoir pourquoi cela se produit

 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
43
demandé sur rmaddy 2016-09-21 08:32:12

2 réponses

Réponse

L'une des situations où vous pourriez recevoir cet avertissement dans Xcode est lorsque vous utilisez une application qui utilise des shaders comme le Cartes application avec un MKMapView. Vous constaterez que la vue de carte fonctionne comme prévu sans cet avertissement sur un appareil réel avec du matériel réel/OS natif.

Dans la carte sim de l' SolidRibbonShader fragment shader n'est pas capable de lire la sortie du v_gradient vertex shader soit parce que c'est un buggy beta ou une version de Xcode. Cependant les shaders sont reconnus sur un appareil réel.

Explication

ces shaders appartiennent à la OpenGL Rendering Pipeline. Le Pipeline de rendu est la séquence d'étapes qu'OpenGL effectue lors du rendu d'objets.

le pipeline de rendu est responsable de choses comme l'application de la texture, la conversion des sommets au système de coordonnées de droite et l'affichage du caractère sur l'écran etc.

Il y a six étapes dans ce pipeline.

  1. Opération Per-Vertex
  2. Primitive De L'Assemblée
  3. Traitement Primitif
  4. Pixellisation
  5. Traitement Des Fragments
  6. Opération Par Fragment

Enfin, une image apparaît sur l'écran de votre appareil. Ces six étapes sont appelées OpenGL Rendering Pipeline et toutes les données utilisées pour le rendu doit passer par là.

qu'est Ce qu'un shader?

un shader est un petit programme développé par vous qui vit dans le GPU. Un shader est écrit dans un langage graphique appelé OpenGL Shading Language (GLSL).

un shader remplace deux étapes importantes de la chaîne de rendu OpenGL:Per-Vertex De Traitement De et Traitement Par Fragment stade. Il y a un shader pour chacun de ces deux étapes.

le but ultime du Vertex Shader est de fournir la transformation finale des sommets de maille au pipeline de rendu. Le but de la Fragment shader est de fournir des données de coloration et de Texture à chaque pixel menant au framebuffer.

Vertex shaders transformer les sommets d'un triangle d'un système de coordonnées local à la position de l'écran. Fragment shaders calculer la couleur d'un pixel à l'intérieur d'un triangle pixellisées sur l'écran.

séparé Shader Objets d'accélérer la Compilation et la Liaison

de nombreuses applications OpenGL ES utilisent plusieurs sommet et fragment shaders, et il est souvent utile de réutiliser le même fragment shader avec vertex shaders ou vice versa. Parce que la spécification core OpenGL ES nécessite un sommet et fragment shader à relier dans un seul programme de shader, mélangeant et faisant correspondre les shaders résulte en un grand nombre de programmes, en augmentant le temps total de compilation de shader et de lien lorsque vous initialisez votre application.

48
répondu tymac 2016-10-26 07:14:30

mise à Jour: le problème semble avoir disparu maintenant sur Xcode9/iOS11.


tout D'abord, le problème du gel ne se produit que lorsque Xcode 8 et uniquement sur iOS 10 (actuellement 10.0.2), que ce soit en mode debug ou release. MKMapView semble cependant très bien lorsque l'application est distribuée via App Store ou des systèmes de distribution ad hoc tiers. Les avertissements que vous voyez peuvent être ou ne pas être liés au problème, Je ne savoir.

ce que j'ai trouvé c'est que le code incriminé est dans le destructeur de MKMapView, et peu importe ce que vous faites avec l'objet map view ou comment vous le configurez, c'est-à-dire simplement appeler

[MKMapView new];

n'importe où dans votre code freeze de l'application. Le fil principal pend sur un sémaphore et on ne sait pas pourquoi.

une des choses que j'ai essayé était de détruire l'objet map view dans un thread séparé mais cela n'a pas aidé. Finalement, j'ai décidé de conserver ma carte objets au moins dans les constructions de débogage.

NOTE: il s'agit d'une solution vraiment sh*tty mais au moins cela vous aidera à déboguer votre application sans gel. Conserver ces objets signifie que votre utilisation de la mémoire augmentera d'environ 45-50MB chaque fois que vous créez un contrôleur de vue avec une carte.

alors, disons si vous avez une propriété mapView, alors vous pouvez le faire dans dealloc de votre contrôleur de vue:

- (void)dealloc
{
#if DEBUG
    // Xcode8/iOS10 MKMapView bug workaround
    static NSMutableArray* unusedObjects;
    if (!unusedObjects)
        unusedObjects = [NSMutableArray new];
    [unusedObjects addObject:_mapView];
#endif
}
3
répondu mojuba 2017-09-20 09:44:25