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:
Đâ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:
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:
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);
}
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
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
@ 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'. –