我做了一個繪畫程序。一切都按我的預期工作。但是在繪畫時,有時會發生一些奇怪的事情。glDrawArrays繪圖不正確
我運行應用程序,並在圖像上按下鼠標左鍵。它應該從代碼中提取點:
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);
在我按下的位置。 mouseDown
註冊mouseDown位置,將其轉換爲NSValue,發送到數組,然後在繪製之前,我將NSValue提取到CGPoint並將其發送到GLfloat,以便它可以由glDrawArrays繪製。但無論我在圖像上點擊鼠標的哪個位置,它都會在座標(0,0)處繪製點。之後,每件事情都行得通。見圖片:
這是第一個問題。第二個問題是,當我用它畫畫(拖動按下鼠標)時,有時點會出現在他們沒有繪製的地方。圖片:
當我繼續拖累消失。經過一些拖動後,它再次出現並再次消失。等等。圖片:
任何想法,爲什麼它會發生?我將波紋管郵編:
鼠標按下:
- (void) mouseDown:(NSEvent *)event
{
location = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:location];
[vertices addObject:locationValue];
[self drawing];
}
鼠標拖拽:
- (void) mouseDragged:(NSEvent *)event
{
location = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:location];
[vertices addObject:locationValue];
[self drawing];
}
圖:
- (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);
}
如果我將其更改爲'[頂點計數]',那麼當我開始繪製時它會中斷。在繪製好的點後,顯示錯誤: '線程1:EXC_BAD_ACCESS(code = 13,adress = 0x0)'位於'glDrawArrays(GL_POINTS,0,count);'或'NSValue * locationValue = [NSValue valueWithPoint:vieta];'錯誤'線程1:信號SIGABRT'。一次一個錯誤,另外一次錯誤。我不知道爲什麼,但錯誤並不總是一樣的 – hockeyman 2012-07-09 07:39:55
有時在中斷時它會在控制檯顯示消息:'OGL(896,0x7fff79c93960)malloc:***錯誤對象0x100151a98:對於釋放對象的校驗和不正確 - 對象可能在被釋放後被修改。 ***在malloc_error_break中設置一個斷點來調試' – hockeyman 2012-07-09 07:48:05
@JuliusPetraška原因可能是您也在'GLOCOLSTINGS'的'malloc'中使用它,所以頂點數組太小而且您再次讀取了太多的頂點(只有這一次導致崩潰)。當然'GLVertices'數組必須具有'[vertices count] * 2'的大小,因爲它包含每個頂點的2個浮點數。但是,你只需要在'glDrawArrays'中繪製'[頂點數]'完整的頂點。 – 2012-07-09 07:48:18