2012-03-20 6 views
0

ndkを使用してopengl es 1を使用して正方形にテクスチャを表示しようとしています。 私はapkからpngをロードするためにこの "ハッキング"を使用しています:http://www.anddev.org/ndk_opengl_-_loading_resources_and_assets_from_native_code-t11978.htmlOpenGL ESテクスチャが4列と行で複製されています

これはうまくいくようです。 クワッドにテクスチャを適用したいとき、テクスチャは重複しているようです。私は問題が私のレンダリングコードから来ていると思ういくつかの研究の後

enter image description here

//the order is correct even if it is not in the numeric order 
GLfloat vertexBuffer[] = { 
    _vertices[0].x, _vertices[0].y, 
    _vertices[3].x, _vertices[3].y, 
    _vertices[1].x, _vertices[1].y, 
    _vertices[2].x, _vertices[2].y, 
}; 

GLfloat texCoords[] = { 
    0.0, 1.0, // left-bottom 
    1.0, 1.0, // right-bottom 
    0.0, 0.0, // left-top 
    1.0, 0.0 // right-top 
}; 

glBindTexture(GL_TEXTURE_2D, _texture->getTexture()); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, 0); 
+0

うーん、私はドン」に投稿されたコードに基づいて起こるはずだと思います。あなたがテクスチャリングに関連して設定している他のOpenGLのenv変数はありますか? glTexParameter(GL_TEXTURE_2D、GL_TEXTURE_WRAP_S、GL_CLAMP); glTexParameter(GL_TEXTURE_2D、GL_TEXTURE_WRAP_T、GL_CLAMP);を設定するとどうなりますか? – Tim

+0

ありがとう、私はglTexParameterを使って試してみましたが、成功しませんでした。そして、画像にアルファチャンネルがないことがわかったら、テクスチャで再生したコードをもう一度チェックしました。問題はpngローディング機能にある必要があります。 –

+0

あなたはOpenGLのテクスチャ座標が確実にマップされていますか? – mr5

答えて

0

問題は間違いなくだったPNGの読み込み機能です。 私はイメージがのlibpng使用してアルファチャンネルを含めるかどうかを確認するためのテストを追加します。

bool hasAlpha; 
switch (info_ptr->color_type) { 
    case PNG_COLOR_TYPE_RGBA: 
     hasAlpha = true; 
     break; 
    case PNG_COLOR_TYPE_RGB: 
     hasAlpha = false; 
     break; 
    default: 
     png_destroy_read_struct(&png_ptr, &info_ptr, NULL); 
     zip_fclose(file); 
     return TEXTURE_LOAD_ERROR; 
} 

を、私はglTexImage2Dパラメータ「internalformat」と「形式」に変更:

glTexImage2D(GL_TEXTURE_2D, 0, hasAlpha ? GL_RGBA : GL_RGB, width, height, 0, hasAlpha ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*) image_data);