2012-07-05 38 views
7

Tôi đã thực hiện một chương trình vẽ tranh. Mọi thứ hoạt động như tôi mong đợi. Nhưng trong khi vẽ, đôi khi một số điều kỳ lạ xảy ra.glDrawArrays không vẽ chính xác

Tôi chạy ứng dụng và nhấn nút chuột trái trên hình ảnh. Nó phải vẽ điểm từ mã:

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

tại điểm tôi nhấn. mouseDown đăng ký mouseDown vị trí, chuyển đổi nó để NSValue, gửi đến mảng, và sau đó trước khi vẽ tôi giải nén NSValue để CGPoint và gửi nó đến GLfloat để nó có thể được rút ra bởi glDrawArrays. Nhưng không có vấn đề mà tôi nhấp chuột vào hình ảnh nó vẽ điểm tại tọa độ (0,0). Sau đó mọi thứ hoạt động OK. Xem hình ảnh:

mouse click

Đây là vấn đề đầu tiên. Vấn đề thứ hai là khi tôi vẽ với nó (kéo chuột ép), đôi khi điểm xuất hiện nơi chúng không được vẽ. Hình ảnh:

mouse drag

Khi tôi tiếp tục kéo nó biến mất. Sau khi một số kéo nó xuất hiện một lần nữa và biến mất một lần nữa. Và cứ thế. Hình ảnh:

enter image description here

Bất kỳ ý tưởng nào tại sao nó có thể xảy ra? Tôi sẽ gửi mã dưới đây:


chuột xuống:

- (void) mouseDown:(NSEvent *)event 
{ 
    location = [self convertPoint: [event locationInWindow] fromView:self]; 
    NSValue *locationValue = [NSValue valueWithPoint:location]; 
    [vertices addObject:locationValue]; 

     [self drawing]; 
} 

Chuột kéo:

- (void) mouseDragged:(NSEvent *)event 
{ 
    location = [self convertPoint: [event locationInWindow] fromView:self]; 
    NSValue *locationValue = [NSValue valueWithPoint:location]; 
    [vertices addObject:locationValue]; 

     [self drawing]; 
} 

Vẽ:

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

Trả lời

6

Bạn đang thiết count biến của bạn (một trong những sử dụng trong glDrawArrays) để [vertices count] * 2, mà dường như xa lạ.

Đối số cuối cùng cho glDrawArrays là số đỉnh để vẽ, trong khi mã của bạn có vẻ như bạn đang đặt số đó gấp đôi số (có thể bạn nghĩ đó là số lượng nổi?), Có nghĩa là bạn chỉ đang vẽ rác sau count đỉnh đầu tiên.

+0

Nếu tôi thay đổi nó để '[ số đỉnh] ', sau đó nó sẽ bị vỡ khi tôi bắt đầu vẽ. Ít điểm được rút ra ok, và sau đó nó hiển thị lỗi: 'Chủ đề 1: EXC_BAD_ACCESS (mã = 13, địa chỉ = 0x0)' tại 'glDrawArrays (GL_POINTS, 0, count);' hoặc tại 'NSValue * locationValue = [NSValue valueWithPoint: vieta]; 'error' Chủ đề 1: tín hiệu SIGABRT'. Một lần một lỗi, thời gian khác lỗi khác. Tôi không biết tại sao, nhưng lỗi là không giống nhau tất cả các thời gian – hockeyman

+0

Và đôi khi tại break nó cho thấy tin nhắn trong giao diện điều khiển: 'OGL (896,0x7fff79c93960) malloc: *** lỗi cho đối tượng 0x100151a98: checksum chính xác cho đối tượng giải phóng - đối tượng có thể đã được sửa đổi sau khi được giải thoát. *** thiết lập một breakpoint trong malloc_error_break để debug' – hockeyman

+0

@ JuliusPetraška Lý do có lẽ là bạn cũng sử dụng nó trong 'malloc' cho' GLVertices', vì vậy mảng đỉnh quá nhỏ và bạn lại một lần nữa đọc quá nhiều đỉnh (chỉ thời gian này dẫn đến một vụ tai nạn). Tất nhiên mảng 'GLVertices' phải có kích thước' [số đỉnh] * 2', bởi vì nó chứa 2 phao cho mỗi đỉnh. Nhưng sau đó bạn chỉ phải vẽ '[đỉnh đếm]' các đỉnh hoàn chỉnh trong 'glDrawArrays'. –

0

Những lập luận để glDrawArrays được định nghĩa là (Chế độ GLenum, GLint đầu tiên, GLsizei coun t).

Đối số thứ hai xác định chỉ mục đầu tiên của thuộc tính đỉnh được sử dụng khi vẽ. Bạn đang vượt qua 1 như là chỉ số đầu tiên mà làm cho tọa độ đỉnh của bạn chưa từng có. Tôi cho rằng bạn muốn 0 ở đó.

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

+0

dù nó 1 hoặc 0. Cùng rezult mọi lúc – hockeyman

1

Thực tế các đỉnh không được hiển thị ở vị trí chính xác mà bạn đã nhấp vào sẽ là gợi ý vấn đề là bạn đã không xác định đúng điểm truy cập trong chế độ xem.

Mã của bạn có:

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

mà nói với quan điểm để chuyển đổi điểm từ tọa độ của nó (tự) để tọa độ quan điểm tương tự của (tự), mặc dù vấn đề là thực sự liên quan đến cửa sổ.

Để chuyển đổi điểm từ tọa độ của cửa sổ để xem, thay đổi dòng đó như sau:

location = [self convertPoint: [event locationInWindow] fromView: nil]; 
Các vấn đề liên quan