2009-06-04 5 views
1

이 코드의 glDrawElements()에 EXC_BAD_ACCESS가 표시되지만 코드의 아래쪽 블록이있는 경우에만 표시됩니다. 나는 포인터가 없거나 일반적으로이 오류를 일으킬 수있는 다른 것들을 발견하지 못하기 때문에 필자가 빠진 개념적 개념이어야한다고 생각하고 있습니다.어떻게 glDrawElements()가 텍스처로 그리는 동안 EXC_BAD_ACCESS를 발생시킬 수 있습니까?

glScalef(6, 6, 6); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3 ,GL_FLOAT, 0, model_verts); 
glEnableClientState(GL_NORMAL_ARRAY); 
glNormalPointer(GL_FLOAT, 0, model_normals); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(num_tex_coords*2, GL_FLOAT, 0, tex_coords); 
glDrawElements(GL_TRIANGLES, num_model_indices0, GL_UNSIGNED_SHORT, &model_indices0); 
glDrawElements(GL_TRIANGLES, num_model_indices1, GL_UNSIGNED_SHORT, &model_indices1); 
glDrawElements(GL_TRIANGLES, num_model_indices2, GL_UNSIGNED_SHORT, &model_indices2); 
glDrawElements(GL_TRIANGLES, num_model_indices3, GL_UNSIGNED_SHORT, &model_indices3); 

이 코드는 내 텍스처를 설정하고 어떤 라인에서도 실패하지 않습니다.

glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBlendFunc(GL_ONE, GL_SRC_COLOR); 
glGenTextures(1, &texture[0]); 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
NSString *path = [[NSBundle mainBundle] pathForResource:@"booktex" ofType:@"jpg"]; 
NSData *texData = [[NSData alloc] initWithContentsOfFile:path]; 
UIImage *image = [[UIImage alloc] initWithData:texData]; 
if (image == nil) 
    NSLog(@"Do real error checking here"); 
GLuint width = CGImageGetWidth(image.CGImage); 
GLuint height = CGImageGetHeight(image.CGImage); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
imageData = malloc(height * width * 4); 
context = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGColorSpaceRelease(colorSpace); 
CGContextClearRect(context, CGRectMake(0, 0, width, height)); 
CGContextTranslateCTM(context, 0, height - height); 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

답변

2
glTexCoordPointer(num_tex_coords*2, GL_FLOAT, 0, tex_coords); 

무엇이 num_tex_coords입니까? 어떻게 tex_coords를 설정하고 있습니까?

glTexCoordPointer의 첫 번째 인수는 (glVertexPointer와 마찬가지로) PER VERTEX의 숫자 여야합니다. 일반적으로 texcoords의 경우이 값은 2입니다.

+0

tex_coords는 .obj 파일에서 구문 분석하는 vt 값을 제공합니다. num_tex_coords는 해당 행의 수이므로 배열에서 값의 수를 얻기 위해 2를 곱합니다. 니펫은 CONST 플로트 tex_coords [] [2] = { \t \t {0.25, 0.375} \t \t {0.375, 0.25} , \t \t {0.25, 0.25} , \t \t {0.375, 0.25} 이고 \t \t {0.25, 0.375}, \t \t {0.375, 0.375} –

1

내가 게시 한 코드에는 아무런 문제가 없습니다. 나에게 다음 단계는 모든 정점 배열이 같은 크기이고 model_indices가 모두 정점 배열 내의 합법적 인 값을 참조하는지 확인하는 것입니다.

+0

모두 괜찮아 보입니다. 텍스처가 없어도 괜찮습니다. 어떻게 든 각면의 텍스처 값을 정의해야합니까? 나는 .obj에서 파싱을하고 있는데, 나는 얼굴 정보를 모두 사용하지 않는다는 것을 깨달았다. (즉, x1/x2/x3 y1/y2/y3 z1/z2/z3) 2 또는 3을 전혀 사용하지 않습니다. –

+0

예, 각면에 제공된 일반 및 텍스처 좌표를 사용하여 일반 배열 및 텍스처 배열을 설정해야합니다. 선은 "f v1/v1/v1 v2/v2/v2 v3/v3/v3"와 같습니다. 모든 "vt"를 텍스처 배열에 추출하여 glTexCoordPointer에 전달해야합니다. "vn"에 대해서도 같은 작업을 수행하고 glNormalPointer에 전달하십시오. 또한 텍스쳐와 일반 배열의 서로 다른면에 대해 동일한 정점을 여러 번 정의하는 .obj 형식으로 인해 정점을 복제해야 할 수도 있습니다. 원하는 경우 다른 질문을하고 여기에 링크를 게시하면 더 자세히 설명하겠습니다. – Kai

관련 문제