2012-07-05 49 views
7

我做了一個繪畫程序。一切都按我的預期工作。但是在繪畫時,有時會發生一些奇怪的事情。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)處繪製點。之後,每件事情都行得通。見圖片:

mouse click

這是第一個問題。第二個問題是,當我用它畫畫(拖動按下鼠標)時,有時點會出現在他們沒有繪製的地方。圖片:

mouse drag

當我繼續拖累消失。經過一些拖動後,它再次出現並再次消失。等等。圖片:

enter image description here

任何想法,爲什麼它會發生?我將波紋管郵編:


鼠標按下:

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

回答

6

你設置你的count變量(在glDrawArrays使用的一個)[vertices count] * 2,這似乎很奇怪。

glDrawArrays的最後一個參數是要繪製的頂點的數量,而在您的代碼中,似乎您將它設置爲將數字加倍(也許您認爲它是浮點數?),這意味着您只是繪製垃圾之後的第一個頂點count

+0

如果我將其更改爲'[頂點計數]',那麼當我開始繪製時它會中斷。在繪製好的點後,顯示錯誤: '線程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

+0

有時在中斷時它會在控制檯顯示消息:'OGL(896,0x7fff79c93960)malloc:***錯誤對象0x100151a98:對於釋放對象的校驗和不正確 - 對象可能在被釋放後被修改。 ***在malloc_error_break中設置一個斷點來調試' – hockeyman 2012-07-09 07:48:05

+0

@JuliusPetraška原因可能是您也在'GLOCOLSTINGS'的'malloc'中使用它,所以頂點數組太小而且您再次讀取了太多的頂點(只有這一次導致崩潰)。當然'GLVertices'數組必須具有'[vertices count] * 2'的大小,因爲它包含每個頂點的2個浮點數。但是,你只需要在'glDrawArrays'中繪製'[頂點數]'完整的頂點。 – 2012-07-09 07:48:18

0

來調用glDrawArrays的參數被定義爲( GLenum模式,GLint第一,GLsizei國家T)。

第二個參數定義繪圖時使用的頂點屬性的第一個索引。您傳遞1作爲第一個使您的頂點座標不匹配的索引。我假設你想在那裏。

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

+0

不管其1或0的相同rezult所有的時間 – hockeyman 2012-07-08 06:56:19

1

頂點沒有呈現在您點擊的確切位置的事實應該是一個提示,問題是您沒有正確確定視圖內的生命點。

你的代碼有:

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

告訴從其座標(個體經營)點轉換爲相同視圖的座標(個體經營),即使該點實際上是相對於窗口視圖。

給點從窗口座標轉換爲視圖,請更改該行於以下內容:

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