2009-06-04 26 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の番号にする必要があります。通常はテックスコードの場合、これは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/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3"のようになります。すべての "vt"をテクスチャ配列に抽出し、glTexCoordPointerに渡す必要があります。 "vn"についても同じことを行い、glNormalPointerに渡します。また、テクスチャと通常の配列の異なる面に対して複数の同じ頂点を定義する.obj形式のため、頂点を複製する必要があるかもしれません。もしあなたが望むなら、別の質問をして、ここにリンクを投稿してください。もっと詳しく説明します。 – Kai

関連する問題