1. ホーム
  2. c++

[解決済み] SOIL_load_image() は null を返します。

2022-02-26 11:07:29

質問

ANSWER

を使用した後 SOIL_last_result() というように dcook と提案され、2つのことがわかりました。

1) 画像を見つけることができませんでした。 PaulMcKenzie とあるように、確かに私の作業ディレクトリは間違っていたようです。 genpfault が言及した。

2) フルパスを設定した後、私のJPEGフォーマット(プログレッシブ)がサポートされていないと表示されました。画像を標準のjpeg形式に設定したら、うまくいきました。

ありがとうございました。


オリジナル質問

現在、OpenGLで使用するためにSOILを使って画像を読み込もうとしています。しかし、それが割り当てられた変数がヌルになってしまうので、適切に画像をロードすることに失敗しているようです。私は、以下を見ようとしました これ が、どうやら属性設定時にレイアウト位置を間違えただけのようです。エラーチェックはさせているのですが( glGetError() ) の行の後にあるのですが、ここでは読みやすさのために省略しました。

OpenGLのエラーは glTexImage2D()GL_INVALID_VALUE . これは、より可能性が高いのは imgWidth / imgHeight の方が大きいです。 GL_MAX_TEXTURE_SIZE ヌル画像によるものです。

出力してください。

null: 1
Max size: 3379
Width: 4298563
Height: 2686488
Obj: 1
GL_INVALID_VALUE - ../src/polygon.cpp:222

コード

    // Generate the texture object and binds it.
    glGenTextures(1, &m_texture);
    glBindTexture(GL_TEXTURE_2D, m_texture);

    // Texture image data
    int imgWidth, imgHeight;

    // Load the texture image.
    unsigned char* image = SOIL_load_image("potato.jpg",
                  &imgWidth,
                  &imgHeight,
                  0,
                  SOIL_LOAD_RGB);


    std::cout << "null: " << !image << std::endl;
    std::cout << "Max size: " << GL_MAX_TEXTURE_SIZE << std::endl;
    std::cout << "Width: " <<  imgWidth << std::endl;
    std::cout << "Height: " << imgHeight << std::endl;
    std::cout << "Obj: " << m_texture << std::endl;

    // Generate the texture to the currently bound texture object.
    glTexImage2D(GL_TEXTURE_2D,
         0,
         GL_RGB,
         imgWidth,
         imgHeight,
         0,
         GL_RGB,
         GL_UNSIGNED_BYTE,
         image);

    // Generate the mipmap to the currently bound texture object.
    glGenerateMipmap(GL_TEXTURE_2D);

    // Unbind and free image data.
    SOIL_free_image_data(image);
    glBindTexture(GL_TEXTURE_2D, 0);

もっとデータが必要な場合は教えてください。ありがとうございます。

EDIT 1: はい、画像は正しい場所にあります。

また、フルパスで試してみましたが、役に立ちませんでした。

解決方法は?

GLではなくSOILの問題のようなので、前回のSOILのエラーを SOIL_last_result を呼び出した後 SOIL_load_image . これで、実際に何が問題になっているのか、より良い手がかりが得られるはずです。