0

私はOpenGLアプリケーションを開発しており、Linux(x86_32とx86_64の両方)ですべてが正常に動作しますが、アプリをWindowsに移植する際に壁にぶつかりました。私のアプリケーションは、非常に基本的なOpenGL 1.0、すばらしいglfw2.7.6およびlibpng1.5.7を使用しています。プログラム全体を移植する前に、これらのライブラリがWindowsで正しく機能するかどうかをテストする、可能な限り単純なコードを書いてみました。テクスチャの使用を開始するまでは、すべてが正常に機能しているように見えました。

プログラムでテクスチャをglTexImage2D(..)使用すると、次のエラーでアクセス違反が発生します。

First-chance exception at 0x69E8F858 (atioglxx.dll) in sidescroll.exe: 0xC0000005: Access violation reading location 0x007C1000.
Unhandled exception at 0x69E8F858 (atioglxx.dll) in sidescroll.exe: 0xC0000005: Access violation reading location 0x007C1000.

調査を行ったところ、おそらくGPUドライバーのバグであることがわかりました。残念ながら、AMD RadeonHD5650を搭載したToshibaL650-1NUノートブックがあります。このノートブックには、ドライバーは提供されていませんが、ベンダーが配布したものは廃止されています。与えられた投稿の作者は使用を提案していますが、私はOpenGL 1.0を使用しているので、このメソッドにアクセスできません。 glBindBuffer

新しいOpenGLを使用せずにこの問題を回避する方法について何かアイデアはありますか?それでも、これが1つのソリューションである場合、 glfwでOpenGL 2.1を使用する方法に関するチュートリアルまたはコードスニペットを提供できますか?

これがエラーの原因となっている私のコードの一部です:

img = img_loadPNG(BACKGROUND);
if (img) {
    printf("%p %d %d %d %d", img->p_ubaData, img->uiWidth, img->uiHeight, img->usiBpp, img->iGlFormat);

    glGenTextures(1, &textures[0]);
    glBindTexture(GL_TEXTURE_2D, textures[0]);
    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, GL_RGBA, img->uiWidth, img->uiHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, img->p_ubaData); //SEGFAULT HERE ON WINDOWS!
    //img_free(img); //it may cause errors on windows
} else printf("Error: loading texture '%s' failed!\n", BACKGROUND);
4

1 に答える 1

4

発生しているエラーは、glTexImage2D に渡すバッファーが、glTexImage2D がパラメーターから推測したものから読み取ろうとするものよりも短いためです。これは Windows ではクラッシュしますが、Linux ではクラッシュしません。なぜなら、Linux ではメモリ割り当てが要求よりも少し大きくなる傾向があるのに対し、Windows では非常に厳しい制約を受けるからです。

ほとんどの場合、PNG は RGB として読み取られます。ただし、glTexImage2D に GL_RGBA を渡すことを伝えます。これはもちろん範囲外にアクセスします。

img受け取った構造には要素が含まれていることがわかりますiGlFormat。これはまさに glTexImage2D に渡す形式になると思います。だからこれを試してください:

glTexImage2D(
    GL_TEXTURE_2D, 0,
    img->iGlFormat, // This is not ideal, OpenGL will chose whatever suits
    img->uiWidth, img->uiHeight, 0,
    img->iGlFormat, GL_UNSIGNED_BYTE,
    img->p_ubaData )
于 2012-09-08T09:21:01.327 に答える