Ho creato un programma di pittura. Tutto funziona come mi aspettavo. Ma mentre si disegna, a volte accadono cose strane.glDrawArray non viene disegnato correttamente
Eseguo app e premo il tasto sinistro del mouse sull'immagine. Dovrebbe attirare il codice:
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);
al punto in cui premo. mouseDown
registra il percorso mouseDown, lo converte in NSValue, invia all'array, e quindi prima di disegnare estro NSValue a CGPoint e lo mando a GLfloat in modo che possa essere disegnato da glDrawArrays. Ma non importa dove clicco il mouse sull'immagine, disegna il punto alle coordinate (0,0). Dopo che tutto funziona OK. Vedi immagine:
Questo è stato il primo problema. Il secondo problema è che quando dipingo con esso (trascina premuto il mouse), a volte appaiono punti in cui non sono disegnati. Immagine:
Quando io continuo trascinamento scompare. Dopo un po 'di trascinamento, appare di nuovo e scompare di nuovo. E così via. Immagine:
Tutte le idee perché potrebbe succedere? Io posto codice qui sotto:
mouse:
- (void) mouseDown:(NSEvent *)event
{
location = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:location];
[vertices addObject:locationValue];
[self drawing];
}
mouse trascinato:
- (void) mouseDragged:(NSEvent *)event
{
location = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:location];
[vertices addObject:locationValue];
[self drawing];
}
Disegno:
- (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);
}
Se cambio a '[ conteggio dei vertici] ', quindi si interrompe quando inizio a disegnare. Pochi punti vengono disegnati ok, e dopo questo viene visualizzato l'errore: 'Thread 1: EXC_BAD_ACCESS (code = 13, adress = 0x0)' a 'glDrawArrays (GL_POINTS, 0, count);' oppure a 'NSValue * locationValue = [NSValue valueWithPoint: vieta]; 'error' Thread 1: signal SIGABRT'. Una volta un errore, altri tempi altri errori. Non so perché, ma l'errore non è sempre lo stesso – hockeyman
E a volte alla rottura mostra un messaggio nella console: 'OGL (896,0x7fff79c93960) malloc: *** errore per l'oggetto 0x100151a98: checksum errato per oggetto liberato - l'oggetto è stato probabilmente modificato dopo essere stato liberato. *** imposta un breakpoint in malloc_error_break per eseguire il debug' – hockeyman
@ JuliusPetraška Probabilmente il motivo è che lo usi anche nel 'malloc' per' GLVertices', quindi l'array di vertici è troppo piccolo e stai ancora una volta leggendo troppi vertici (solo che questa volta si è verificato un arresto anomalo). Ovviamente l'array 'GLVertices' deve avere una dimensione di' [numero di vertici] * 2', perché contiene 2 float per ogni vertice. Ma poi devi solo disegnare '[vertici dei conti]' completi i vertici in 'glDrawArrays'. –