2012-07-05 13 views
7

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:

mouse click

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:

mouse drag

Quando io continuo trascinamento scompare. Dopo un po 'di trascinamento, appare di nuovo e scompare di nuovo. E così via. Immagine:

enter image description here

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); 
} 

risposta

6

si sta impostando una count variabile (quello usato in glDrawArrays) per [vertices count] * 2, che sembra strano.

L'ultimo argomento a glDrawArrays è il numero di vertici da disegnare, mentre nel codice sembra che lo si stia impostando per raddoppiare il numero (forse si pensava che fosse il numero di galleggianti?), Il che significa che si sta disegnando solo spazzatura dopo i primi vertici count.

+0

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

+0

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

+0

@ 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'. –

0

Gli argomenti glDrawArrays sono definiti come (Modalità GLENUM, prima GLint, GLsizei coun t).

Il secondo argomento definisce il primo indice degli attributi del vertice utilizzati durante il disegno. Stai passando 1 come primo indice che rende non coordinate le coordinate del tuo vertice. Suppongo che tu voglia 0 lì.

http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml

+0

non importa il suo 1 o 0. La stessa rezult tutto il tempo – hockeyman

1

Il fatto che i vertici non siano visualizzati nella posizione esatta su cui si è fatto clic dovrebbe essere un suggerimento, il problema è che non si è determinato correttamente il punto di impatto all'interno della vista.

il codice ha:

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

che dice al fine di convertire il punto dalle sue coordinate (auto-) alle coordinate stesso della vista (auto), anche se il punto è in realtà rispetto alla finestra.

Per convertire il punto da coordinate della finestra alla vista, cambiare quella riga come segue:

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