8
votes

GLDRAWARRAIS ne dessine pas correctement

J'ai fait un programme de peinture. Tout fonctionne comme je m'y attendais. Mais en dessinant, parfois certaines choses étranges se produisent.

i Exécutez l'application et appuyez sur le bouton gauche de la souris sur l'image. Il devrait dessiner le point de code: p> xxx pré>

au point où j'appuie. MouseDown Code> Registres MouseDown Situation, la convertit à NSValue, envoie au tableau, puis avant de dessiner, j'entraîne NSValue sur CGPoint et envoyez-la à GLFLOOt afin qu'il puisse être tiré par GLDRAWARRAIS. Mais peu importe où je clique sur la souris sur l'image, il tire le point aux coordonnées (0,0). Après cela, tout fonctionne bien. Voir l'image: p>

souris click p>

C'était premier problème. Le deuxième problème est que lorsque je peint avec elle (faites glisser la souris enfoncée), des points apparaissent parfois où ils ne sont pas dessinés. Image: p>

glisser la souris p>

Quand je continue la traînée . Après que certains traînés, cela apparaisse à nouveau et disparaisse à nouveau. Etc. Image: P>

Entrez la description de l'image ici p>

Des idées pourquoi il pourrait arriver? Je posterai le code ci-dessous: p>


souris down: p> xxx pré>

souris glissé: p>

- (void) drawing {
int count = [vertices count] * 2;
NSLog(@"count: %d", count);
int currIndex = 0;
GLfloat *GLVertices = (GLfloat *)malloc(count * sizeof(GLfloat));
for (NSValue *locationValue in vertices) {
    CGPoint loc = locationValue.pointValue;
    GLVertices[currIndex++] = loc.x;
    GLVertices[currIndex++] = loc.y;    
 }
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, brushTextura);
glPointSize(100);
glVertexPointer(2, GL_FLOAT, 0, GLVertices);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);
}


0 commentaires

3 Réponses :


0
votes

Les arguments des GLDRAWARRAIS sont définis comme (GLENUM MODE, GLINT GLINT, COMPTE GLSIZEI).

Les deuxièmes arguments définissent le premier index des attributs Vertex utilisés lors du dessin. Vous passez 1 en tant que premier index qui rend votre Vertex Coordonnées inégalée. Je suppose que tu veux 0 là-bas.

http://www.opengl.org/sdk/docs/ Man / XHTML / GLDRAWARRAIS.XML


0 commentaires

7
votes

Vous définissez votre variable variable (celle utilisée dans GLDRAWARRAYA ) sur [nombre de sommets] * 2 , qui semble étrange. < / p>

Le dernier argument à GLDRAWARRAAILES est le nombre de sommets à dessiner, alors que dans votre code, il semble que vous définissez cela pour doubler le nombre (vous avez peut-être pensé que c'était le nombre de flotteurs?), qui signifie que vous attrapez simplement des ordures après le premier compter sommets.


4 commentaires

Si je le change en [Les sommets comptent] , il se casse lorsque je commence à dessiner. Peu de points étant dessinés OK, et après cela, il montrait une erreur: thread 1: exc_bad_access (code = 13, adresse = 0x0) au GLDRAWARRAY (GL_POOTS, 0, Compte); Ou à NSValue * EmplacementValue = [Nsvalue Valuewithpoint: Vieta]; Erreur Fil 1: Signal SIGABRT . Une erreur une fois une erreur, une autre erreur d'autre erreur. Je ne sais pas pourquoi, mais l'erreur n'est pas la même tout le temps


Et parfois à la casse, il affiche un message dans la console: OGL (896,0x7FF79C93960) MALLOC: *** Erreur pour l'objet 0x100151A98: CheckSum incorrect pour objet libéré - objet a probablement été modifié après avoir été libéré. *** Définir un point d'arrêt dans malloc_error_break pour déboguer


@ Juliuspetraška La raison est probablement que vous l'utilisez également dans le MALLOC pour GLVERTIS , de sorte que le tableau Vertex est trop petit et que vous lisez une fois de plus trop de sommets (seulement ceci temps entraînant un crash). Bien sûr, les grevices doivent avoir une taille de [nombre de sommets] * 2 , car il contient 2 flotteurs pour chaque sommet. Mais alors vous devez seulement dessiner [nombre de sommets] des sommets complets dans GLDRAWARRAIS .


Merci beaucoup P.S. Je ne peux pas vous adorez avec Bounty maintenant. Il dit que je dois attendre 23 heures



1
votes

Le fait que les sommets ne sont pas rendus dans l'emplacement exact que vous avez cliqué sur ON doivent être un indice de problème que vous n'avez pas déterminé correctement le point de frappe dans la vue.

Votre code a: P> xxx pré>

qui indique la vue de convertir le point de ses coordonnées (auto) vers les coordonnées de la même vue (auto), même si le point est réellement relativement à la fenêtre. P>

Pour convertir le point de la fenêtre des coordonnées de la fenêtre en vue, modifiez cette ligne ci-dessous: P>

location = [self convertPoint: [event locationInWindow] fromView: nil];


0 commentaires