Iphone 使用纹理绘制时,GLDrawerElements()如何导致EXC\u BAD\u访问?

Iphone 使用纹理绘制时,GLDrawerElements()如何导致EXC\u BAD\u访问?,iphone,opengl-es,Iphone,Opengl Es,在这段代码中,我获得了对glDrawerElements()的EXC_BAD_访问权限,但仅当代码的底部块存在时。我想这一定是我缺少的一些概念性的东西,因为我没有找到任何nil指针或其他可能导致此错误的东西 glScalef(6, 6, 6); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3 ,GL_FLOAT, 0, model_verts); glEnableClientState(GL_NORMAL_ARRAY); glNor

在这段代码中,我获得了对glDrawerElements()的EXC_BAD_访问权限,但仅当代码的底部块存在时。我想这一定是我缺少的一些概念性的东西,因为我没有找到任何nil指针或其他可能导致此错误的东西

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

我看不出你发布的代码有什么问题。对我来说,下一步是检查所有顶点数组的大小是否相同,以及model_索引是否都引用了顶点数组中的合法值

glTexCoordPointer(num_tex_coords*2, GL_FLOAT, 0, tex_coords);
什么是num_tex_coords? 你是如何建立tex_coords的


glTexCoordPointer的第一个参数应该是每个顶点的数量(就像glVertexPointer一样)。对于texcoords,通常为2

它们看起来都很好,画得很好,没有纹理。我是否需要为每个面定义纹理值?我正在从.obj解析,我刚刚意识到我没有使用所有的面部信息。(即f x1/x2/x3 y1/y2/y3 z1/z2/z3)我根本不使用2或3。是的,您需要使用为每个面提供的法线和纹理坐标设置法线阵列和纹理阵列。一行看起来像“f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3”。您需要将所有“vt”提取到纹理数组中,并将其传递给glTexCoordPointer。对“vn”执行相同的操作,并传递给glNormalPointer。还请注意,由于.obj格式为纹理和法线阵列中的不同面多次定义相同的顶点,因此可能必须复制顶点。如果您愿意,可以问另一个问题,在这里发布一个链接,我将详细介绍更多内容。tex_坐标来自我从.obj文件解析的vt值。num_tex_coords是这些行的计数,所以我乘以2得到数组中的值数。代码段是const float tex_coords[][2]={{0.25,0.375},{0.375,0.25},{0.25,0.25},{0.375,0.25},{0.25,0.375},{0.375,0.375},