2012-07-05 5 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로 추출하고 glDrawArrays에서 그릴 수 있도록 GLfloat로 보냅니다. 그러나 이미지에서 마우스를 클릭해도 좌표 (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]; 
} 

그리기 : 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); 
} 

답변

6

당신은 당신의 count 변수 이상한 것 같다 [vertices count] * 2에 (glDrawArrays에 사용되는)를 설정한다. 코드에서 당신이 방금 쓰레기를 그리는 의미 수를 (아마도 당신이 수레의 수의 생각?), 두 배를 설정하는 것 같다 반면

glDrawArrays의 마지막 인수가

정점의 수는 그릴 첫 번째 count 정점 이후.

+0

을 내가 그것을 변경하는 경우'[ vertices count]'라고 입력하면 드로잉을 시작할 때 끊어집니다. 괜찮은 부분이 그려지는데, 그 다음에는 glDrawArrays (GL_POINTS, 0, count); 또는 NSValue * locationValue = [NSValue]에있는 오류 : '스레드 1 : EXC_BAD_ACCESS (코드 = 13, 주소 = 0x0) valueWithPoint : vieta];'오류'스레드 1 : 시그널 SIGABRT'. 한 번만 오류, 다른 시간은 다른 오류. 이유는 모르겠지만 오류는 항상 동일하지 않습니다. – hockeyman

+0

때로는 휴식 시간에 콘솔에 메시지가 표시됩니다. 'OGL (896,0x7fff79c93960) malloc : *** 오류 *** 0x100151a98 : 해제 된 개체에 대한 체크섬이 잘못되었습니다. 오브젝트가 해제 된 후 수정되었을 가능성이 있습니다. *** malloc_error_break에 중단 점을 설정하여 디버그합니다. ' – hockeyman

+0

@ JuliusPetraška'GLVertices'에 'malloc'을 사용하는 이유는 아마도 정점 배열이 너무 작아서 다시 한번 너무 많은 정점을 읽는 것입니다 (이번에 만 충돌이 발생 함). 물론'GLVertices' 배열은 각 꼭지점마다 2 개의 부동 소수점을 포함하고 있기 때문에'[vertices count] * 2'의 크기를 가져야합니다. 그러나 여러분은'glDrawArrays'에 완전한 꼭지점을''[vertices count]''그려야 만합니다. –

0

인수는 다음과 같이 정의된다 (GLenum 모드, GLint 우선, GLsizei coun 티).

두 번째 인수는 그리기 할 때 사용되는 정점 속성의 첫 번째 인덱스를 정의합니다. 꼭짓점 좌표를 일치시키지 않는 첫 번째 인덱스로 1을 전달합니다. 0을 원한다고 가정합니다.

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

+0

에 상관없이 자사의 1 또는 0 같은 rezult 모든 시간 – hockeyman

1

클릭 한 정확한 위치에 꼭지점이 렌더링되지 않는다는 사실은 힌트가되어야합니다.보기 내에서 히트 포인트가 제대로 결정되지 않았다는 것이 문제입니다.

코드는 있습니다 지점이 실제로 창을 기준으로하더라도, 동일한 뷰의 좌표 (자기) 그것의 좌표 (자기)에서 점을 변환 할 수있는 뷰를 알려줍니다

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

합니다.

가보기에 윈도우의 좌표에서 점을 변환하려면이 줄을 변경하려면 다음

location = [self convertPoint: [event locationInWindow] fromView: nil]; 
관련 문제