44 votes

AVERTISSEMENT: La sortie du vertex shader 'v_gradient' n'est pas lue par le fragment shader

Lorsque j'exécute mon application sous iOS 10 à l'aide de xcode 8, le message suivant s'affiche dans la console de débogage et, en cas de gel de l'interface utilisateur, peut-on 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
 

50voto

tymac Points 7397

Réponse

L'une des situations où vous pourriez obtenir cet avertissement dans Xcode est lors de l'utilisation d'une application qui utilise les shaders comme les Cartes app avec un MKMapView. Vous verrez que la carte fonctionne comme prévu, sans que l'avertissement sur un périphérique réel avec de vrais matériel/système d'exploitation natif.

Dans la carte sim de l' SolidRibbonShader fragment shader n'est pas en mesure de lire la sortie de l' v_gradient vertex shader, probablement parce qu'il est en beta ou il pourrait y avoir une incompatibilité entre Xcode version SIM et version. Cependant, les shaders sont reconnues sur un périphérique réel.

Explication

Ces shaders appartiennent à l' OpenGL Pipeline de Rendu. Le Pipeline de Rendu est la séquence d'étapes OpenGL prend lors du rendu des objets.

Le pipeline de rendu responsable pour des choses telles que l'application de la texture, de la conversion des sommets à la droite système de coordonnées et afficher les caractères sur l'écran etc.

Il y a six étapes dans ce pipeline.

  1. Par Sommet De L'Opération
  2. Primitive De L'Assemblée
  3. Primitives De Traitement
  4. Le tramage
  5. Fragment De Traitement
  6. Par-Fragment De Fonctionnement

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

Qu'est ce qu'un shader?

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

Un shader qui prend la place de deux étapes importantes dans le Pipeline de Rendu OpenGL: Per-Vertex de Traitement et Par Traitement des fragments de la scène. Il y en a un shader pour chacune de ces deux étapes.

Le but ultime de l' Vertex Shader est de fournir à la transformation finale des sommets du maillage pour le pipeline de rendu. L'objectif de l' Fragment shader est de fournir la Coloration et la Texture de données pour chaque pixel de partir pour le framebuffer.

Vertex shaders transformer les sommets d'un triangle à partir d'un modèle local de système de coordonnées à 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éparer Shader Objets d'accélérer la Compilation et la Liaison

De nombreux OpenGL ES aux applications d'utiliser plusieurs vertex et fragment shaders, et il est souvent utile de réutiliser le même fragment shader avec différents vertex shaders , ou vice versa. Parce que le coeur OpenGL ES spécification exige un vertex et fragment shader pour être reliés à un seul programme de shaders, le mélange et l'appariement des shaders résultats dans un grand nombre de programmes, l'accroissement total de shader compiler et lier de temps lors de l'initialisation de votre application.

3voto

mojuba Points 1583

Mise à jour: le problème semble avoir disparu maintenant sur Xcode9/iOS11.


Tout d'abord, le gel problème se produit uniquement lorsque vous exécutez à partir de Xcode 8 et uniquement sur iOS 10 (actuellement 10.0.2), que ce soit en mode debug ou release. MKMapView mais semble très bien lorsque l'application est distribuée via l'App Store ou le 3e partie ad hoc sur les systèmes de distribution. Les mises en garde que vous voyez peut ou peut ne pas être liée au problème, je ne sais pas.

Ce que j'ai trouvé, c'est que le code malveillant est en MKMapView du destructeur, et il n'a pas d'importance ce que vous faites avec la vue de la carte de l'objet ou de la façon dont vous le configurer, c'est à dire simplement de lancer un appel

[MKMapView new];

n'importe où dans votre code freeze de l'application. Le thread principal se bloque sur un sémaphore et il n'est pas clair pourquoi.

Une des choses que j'ai essayé était de détruire la vue de la carte de l'objet dans un thread séparé, mais cela n'a pas aidé. Finalement, j'ai décidé de conserver mon les objets de la carte, au moins dans les versions de DÉBOGAGE.

REMARQUE: c'est vraiment un sh*tty solution de contournement, mais au moins il va vous aider à déboguer votre application sans gel. En conservant ces objets signifie que votre utilisation de la mémoire va croître d'environ 45-50 MO à chaque fois que vous créez une vue contrôleur avec une carte.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X