2011-03-12 6 views
2

私はこの小さなゲームをSDL + OpenGLで作っています。ゲームは私のPC上で正常に動作しますが、友人のPC上では、単に白いボックスと空白の画面が表示されます。他のPCのOpenGL白いテクスチャ

私のテクスチャが2の非累乗であるため、問題である可能性があると私は考えました。私はテクスチャの寸法を変更することができないので、いくつかの検索の後、GL_ARB_texture_non_power_of_twoを使用すると、何らかの形で(?)npotテクスチャが強制されることがわかりました。しかし、私の驚いたことに、白い箱やものは私のPCに表示され、彼らは私の友人にも行きませんでした。私は問題が何であるか理解できません。どんな助けでも大歓迎です。

コード:

numColors = images[i]->format->BytesPerPixel; 
    if (numColors == 4) 
    { 
     if (images[i]->format->Rmask == 0x000000FF) 
      textureFormat = GL_RGBA; 
     else 
      textureFormat = GL_BGRA; 
    } 
    else if (numColors == 3) 
    { 
     if (images[i]->format->Rmask == 0x000000FF) 
      textureFormat = GL_RGBA; 
     else 
      textureFormat = GL_BGRA; 
    } 
    glPixelStorei(GL_UNPACK_ALIGNMENT,4); 
    glGenTextures(1, &textures[i]); 
    glBindTexture(GL_ARB_texture_non_power_of_two, textures[i]); 
    glTexParameteri(GL_ARB_texture_non_power_of_two,GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_ARB_texture_non_power_of_two,GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexImage2D(GL_ARB_texture_non_power_of_two, 0, numColors, images[i]->w, images[i]->h, 0, textureFormat, GL_UNSIGNED_BYTE, images[i]->pixels); 
+0

ホワイトボックスPCはNPOTテクスチャをサポートしていますか?その延長だけ – Macke

+0

申し訳ありませんが、私はあなたを取得していません.. – tf61

+0

申し訳ありませんが、キーボードにつまずいた。 NPOTはあなたが有効にできるものではありません、それはGPUがサポートしている(またはしていない)ものです。ですから、NPOTは機能していないGPUの拡張文字列にリストされていますか? – Macke

答えて

1

お友達のビデオカードは、したがって、出力がGL_ARB_texture_non_power_of_two拡張子を使用しているにもかかわらず、依然として間違っている、2つのテクスチャのノンパワーをサポートしていないかもしれません。

ゲームが特定のOpenGL拡張機能を正しく表示することが必要な場合は、起動時にこれらの拡張機能をチェックし、ハードウェアに機能がない場合はゲームを実行できないことをユーザーに伝えます。

+0

私はその機能はドライバに左右されると思いますよね? Intel G31チップセット(GMA3100 IGP)を搭載した2つのシステムで、ゲームがうまく動作しているのが見えたからです。 – tf61

+0

拡張機能をチェックしたい場合: 'glGetString(GL_EXTENSIONS)'を呼び出すと、アプリケーションが実行時に解析できる、拡張名のスペースで区切られた文字列が返されます。 – Yuri

+0

ドライバの更新は役に立ちません。 – tf61

1

GL_TEXTURE_2Dの代わりにGL_ARB_texture_non_power_of_twoを使用しないでください。拡張機能がサポートされているかどうかを確認してから、glTexImage(GL_TEXTURE_2D、w、h、...)を使ってNPOTテクスチャを送信してください。

エラーが発生しているかどうかを確認するには、glGetError()を呼び出します。 GL_ARB _... npotは、あなたが使用するときに有効な値ではないので、あなたはすべきです。

GL_ARB_NPOTは、1Dおよび3Dテクスチャにも使用されます。

+0

Hm ..つまり、私のPCがNPOTテクスチャをサポートしている場合、GL_ARBは使用しないでください。それはいいです。あなたはこれを私の友人のPCで動かすための何かを提案できますか?それが完全にNPOTでない場合は、SFMLがnpotテクスチャを描くことができると思いますか? – tf61

+0

@ tf61:SFML? .. – Macke

+0

私はSFML(sfml-dev.org)ライブラリについて話しています。 – tf61

0

さらに、ARB_texture_non_power_of_twoには別の拡張子があります。GL_ARB_texture_rectangle;非常に古い、それは年齢のGPUによってサポートされています。あなたのコードがところで

glPixelStorei(GL_UNPACK_ALIGNMENT,4); 
glGenTextures(1, &textures[i]); 
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textures[i]); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, numColors, images[i]->w, images[i]->h, 0, textureFormat, GL_UNSIGNED_BYTE, images[i]->pixels); 

のように見えるだろうと使い方:GL_ARB_texture_non_power_of_twoは、拡張名ではなく、テクスチャのターゲットとして使用する有効なトークンです。 OpenGLがGL_INVALID_ENUMエラーを発行しているはずです。

+1

GL_TEXTURE_RECTANGLEは整数で正規化されていないテクスチャを使用することに注意してください。 floatとして0..1の代わりに幅)。しかし、それは動作する可能性があります。 – Macke

+0

@マッケ:そうです。私はその細部について言及するのを忘れていた。 – datenwolf

+0

OpenGL Extensionsビューアからは、私のグラフィックスチップセットがテクスチャ矩形をサポートしているようですが、私が使用すると、宣言されていない識別子エラーが発生しています。 – tf61

関連する問題