4

BMP textureを読み込んで立方体の面に表示することができません。
私は取り組んでいます.私のWindows 7コンパイラは.私はbmpをロードするためにVisual Studio 2010 Express使用FreeImageします.私の画像のビット深度は24です.私の画像サイズは256 * 256ですSDL.ウィンドウを作成してイベントを処理するために使用しています.
プログラムをコンパイルして実行すると、キューブはまだ白く、面には何も表示されません。テクスチャをGLuint変数にロードしています。その変数を出力すると、「1」のみが出力されます。私の友人の 1 人が、私のグラフィック カードはこのOpenGLバージョンUbuntuの私のWindows適切に?
私のグラフィック カードが必要な場合は、NVIDIA GT240 DDR5.

編集

これは私のinitgl関数です:

//OpenGL initialization.
int initGL(void)
{
    glEnable(GL_TEXTURE_2D); //Enable texture mapping.
    if(!loadGLTextures("bmp_24.bmp"))
        return false;

    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f , 0.0f , 0.0f , 0.5f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    //Nice perspective.
    glHint(GL_PERSPECTIVE_CORRECTION_HINT , GL_NICEST);
    return true;
}

そして、これは image.GLuint texture[1] をロードする関数です:

//This function will load a bitmap image.
bool loadGLTextures(const char* file)
{
    FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;

    fif = FreeImage_GetFileType(file , 0);
    if(fif == FIF_UNKNOWN)
        fif = FreeImage_GetFIFFromFilename(file);
    if(fif == FIF_UNKNOWN)
        return false;

    FIBITMAP* dib = FreeImage_Load(fif , file);

    if(!dib)
        return false;
    
    //Create the texture.
    glGenTextures(1 , &texture[0]);

    //Typical texture generation using data from the bitmap.
    glBindTexture(GL_TEXTURE_2D , texture[0]);

    //Generate the texture.
    glTexImage2D(GL_TEXTURE_2D , 0 , GL_RGB , FreeImage_GetWidth(dib) , 
        FreeImage_GetHeight(dib) , 0 , GL_BGR_EXT , GL_UNSIGNED_BYTE , 
        FreeImage_GetBits(dib));



    //Linear filtering.
    glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR);

    printf("%d" , texture[0]);

    FreeImage_Unload(dib);

    return true;

}

そして、これは私のレンダリング関数です:

//All of the drawing goes through this.
int drawGLScene(void)
{
    static float xrot = 0 , yrot = 0 , zrot = 0;
    //Clear screen and depth buffer.
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(0.0f , 0.0f , -5.0f);
    glRotatef(xrot , 1.0f , 0.0f , 0.0f);
    glRotatef(yrot , 0.0f , 1.0f , 0.0f);
    glRotatef(zrot , 0.0f , 0.0f  ,1.0f);

    //Select the texture.
    glBindTexture(GL_TEXTURE_2D , texture[0]);

    glBegin(GL_QUADS);
    //Front:
    //Bottom left of the texture and quad.
    glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
    //Bottom right fo the texture and quad.
    glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , 1.0f);
    //Top right of the texture and quad.
    glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);
    //Top left of the texture and quad.
    glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , 1.0f);

    //Back:
    //Bottom left of the texture and quad.
    glTexCoord2f(0.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
    //Bottom right of the texture and quad.
    glTexCoord2f(1.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
    //Top right of the texture and the quad.
    glTexCoord2f(1.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
    //Top left of the texture and the quad.
    glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);

    //Top:
    //Top right of the texture and quad.
    glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);
    //Top left of the texture and quad.
    glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
    //Bottom left of the texture and quad.
    glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , 1.0f , 1.0f);
    //Bottom right of the texture and quad.
    glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);

    //Bottom:
    //Top left of the texture and quad.
    glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
    //Bottom left of the texture and quad.
    glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
    //Bottom right of the texture and quad.
    glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
    //Top right of the texture and quad.
    glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , -1.0f , 1.0f);

    //Right:
    //Bottom right of the texture and quad.
    glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
    //Top right of the texture and quad.
    glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);
    //Top left of the texture and quad.
    glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);
    //Bottom left of the texture and quad.
    glTexCoord2f(0.0f , 0.0f); glVertex3f(1.0f , -1.0f , 1.0f);

    //Left:
    //Bottom left of the texture and quad.
    glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
    //Bottom right of the texture and quad.
    glTexCoord2f(1.0f , 0.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
    //Top right of the texture and quad.
    glTexCoord2f(1.0f , 1.0f); glVertex3f(-1.0f , 1.0f , 1.0f);
    //Top left of the texture and quad.
    glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
    glEnd();

    SDL_GL_SwapBuffers();

    xrot += 0.1;
    yrot += 0.1;
    zrot += 0.1;

    return true;

}
4

3 に答える 3

6

コードで問題が発生する可能性があるものは多数あります。

私の疑いは、あなたがinitGL()時期尚早に、つまりコンテキストがまだ利用できない状態で呼び出しているということです。あなたは問題のコードを示していないので、これについては推測しかできません。

テクスチャリング ユニットを有効にすることは、描画のみに重要です。テクスチャ ユニットを無効にしてテクスチャ データをアップロードできます。クワッド描画コードの直前に置くことを強くお勧めしますglEnable(GL_TEXTURE_2D);(実際には、glEnable と glDisable はいくつかの理由で描画コードにのみ呼び出す必要があります)。

テクスチャをロードすると、いくつかの健全性チェックを実行できません。また、ピクセル ストア パラメータを適切に設定するのを忘れると、テクスチャが歪んで見えます。また、ブール値を使用して ID をグローバル変数に入れるのではなく、ロード関数からテクスチャ ID を返すことも理にかなっています。テクスチャ ID 0 は予約されているため、これを使用してエラーを示すことができます。

ただし、フィルター モードを設定するので、ミップマップ レベルが定義されていなくても問題ありません。

于 2012-06-17T16:32:49.287 に答える
0

GL_TEXTURES_2Dテクスチャを作成する前に有効にする必要があるため、呼び出すglEnable(GL_TEXTURE_2D);前に呼び出す必要がありますglGenTextures(1 , &texture[0]);

また、透過性を有効にするには、`glEnable(GL_BLEND);` を呼び出す必要があります。

それでも、これはUbuntuでは機能するがWindowsでは機能しない理由を説明していません...試してみて、役立つかどうかを確認してください。

編集:レンダー関数を投稿しましたが、1 つ気づいたことは、レンダリング カラーを設定していないことです。電話してみる

glColor4f(r,g,b,a); // r, g, b and a are float between [0,1], specifying your desired color

glLoadIdentity();と最初のglVertex3f電話の間のどこか

于 2012-06-17T10:54:46.820 に答える
0

テクスチャの寸法は、1、2、4、8、16、32、64 などの 2 の累乗ではない場合があります。

これは、一部のハードウェア、一般に古いハードウェアでもこのような問題を引き起こす可能性があります。

乾杯 ;)

于 2013-05-22T10:00:24.327 に答える