그림 프로그램을 만들었습니다. 모든 것이 내가 예상 한대로 작동합니다. 그러나 그림을 그리는 동안 때로는 이상한 일들이 일어납니다.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로 추출하고 glDrawArrays에서 그릴 수 있도록 GLfloat로 보냅니다. 그러나 이미지에서 마우스를 클릭해도 좌표 (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];
}
그리기 : glDrawArrays에
- (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);
}
을 내가 그것을 변경하는 경우'[ vertices count]'라고 입력하면 드로잉을 시작할 때 끊어집니다. 괜찮은 부분이 그려지는데, 그 다음에는 glDrawArrays (GL_POINTS, 0, count); 또는 NSValue * locationValue = [NSValue]에있는 오류 : '스레드 1 : EXC_BAD_ACCESS (코드 = 13, 주소 = 0x0) valueWithPoint : vieta];'오류'스레드 1 : 시그널 SIGABRT'. 한 번만 오류, 다른 시간은 다른 오류. 이유는 모르겠지만 오류는 항상 동일하지 않습니다. – hockeyman
때로는 휴식 시간에 콘솔에 메시지가 표시됩니다. 'OGL (896,0x7fff79c93960) malloc : *** 오류 *** 0x100151a98 : 해제 된 개체에 대한 체크섬이 잘못되었습니다. 오브젝트가 해제 된 후 수정되었을 가능성이 있습니다. *** malloc_error_break에 중단 점을 설정하여 디버그합니다. ' – hockeyman
@ JuliusPetraška'GLVertices'에 'malloc'을 사용하는 이유는 아마도 정점 배열이 너무 작아서 다시 한번 너무 많은 정점을 읽는 것입니다 (이번에 만 충돌이 발생 함). 물론'GLVertices' 배열은 각 꼭지점마다 2 개의 부동 소수점을 포함하고 있기 때문에'[vertices count] * 2'의 크기를 가져야합니다. 그러나 여러분은'glDrawArrays'에 완전한 꼭지점을''[vertices count]''그려야 만합니다. –