2012-04-15 23 views
0

私はすでにいくつかのデスクトップ(PC)プロジェクトでstb_imageを使用していましたが、うまくいきましたが、今はOpenGL ESで使用するためにいくつかのタグを読み込もうとしています。 't。 これは私が使用するコードです:stb_imageがiPhoneで動作しない

void TextureManager::LoadFontTexture(const char *filename,int rows,int columns) 
{ 
    glGenTextures(1,&textures[texNum]); 
    texNum++; 
    glBindTexture(GL_TEXTURE_2D,textures[texNum-1]); 
    int x,y,n; 
    GLenum format; 
    unsigned char *data=stbi_load(filename,&x,&y,&n,0); 
    if (data==NULL) 
    { 
     NSLog(@"Data loaded incorrectly"); 
     NSLog(@"Failure reason:%s",stbi_failure_reason()); 
    } 
    else { 
     NSLog(@"Width:%d height:%d",x,y); 
    } 
    if (n==3) 
    { 
     format=GL_RGB; 
    } 
    else if (n==4) 
    { 
     format=GL_RGBA; 
    } 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D,0,n,x,y,0,format,GL_UNSIGNED_BYTE,data); 
} 

このコードでは、デスクトップ上にうまく働いたが、私はこのイメージで何かをtexturizeしようとすると、黒い四角形を取得します。 widthとheightの値は正しく、常に(n == 4)ifが呼び出されます(画像にアルファチャンネルがあるので、これは正しいです)。私は何が間違っているのか分からない。私はまた、フォーマット= GL_BGRAでフォーマット= GL_RGBAを変更しようとしましたが、それは

+0

FWIWでは、コードが潜在的にリソースをリークすることに注意してください。イメージの読み込みに失敗すると、GLテクスチャはとにかく生成され、解放されません。また、 'stbi_load'の後には' stbi_image_free'呼び出しが必要です。 – rotoglup

答えて

2

glTexImage2D呼び出しは次のようになります動作しません:

glTexImage2D(GL_TEXTURE_2D,0,format,x,y,0,format,GL_UNSIGNED_BYTE,data); 

3または4は、OpenGL ESでinternalformatの有効な値ではありません。ここではドキュメントを参照してください:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml

編集:ここでOpenGLのエラーをdectectする方法の詳細情報です:

エラーglGetError関数を使用し、このタイプのを検出します。どの機能が失敗したかがわかります。例えば は - 次のマクロを作成します。

#define GL_CHECK(x) do { 
    x; 
    GLenum glerr = glGetError(); 
    if (glerr != GL_NO_ERROR) { 
     NSLog(@"OpenGL error: %d, file: %s, line: %d", glerr, __FILE__, __LINE__); 
    } 
} while (0) 

次に、このようなすべてのOpenGLの機能を中心に、それを使用します。

GL_CHECK(glTexImage2D(GL_TEXTURE_2D,0,n,x,y,0,format,GL_UNSIGNED_BYTE,data)); 

をこれは、すぐにエラーがファイル名と行番号を含め、ここであなたが知っているだろう。 もちろん、アプリケーションを出荷する際は、リリースモードでのチェックを無効にしてください。

#define GL_CHECK(x) x; 
+0

ありがとうございます! – XaitormanX

+0

エラーチェックの方法を再度ありがとうございました – XaitormanX

+0

私はエラーがなく、まだ黒い質感があります –

関連する問題