2016-11-19 14 views
1

OpenGL、Assimp、Boost.GILを使ってモデルをロードする簡単なアプリを書いた。Boost.GILを使ってOpenGLテクスチャを読み込む

私のモデルにはPNGテクスチャが含まれています。私がGILを使ってロードし、OPENGLを通してレンダリングすると、私は間違った結果を得ました。感謝のコードXLの、私はOpenGLGLでロードされた自分のテクスチャが画像自体とは全く異なることがわかりました。

これも同様の質問ですが、私はその手順に従いましたが、同じミスがありました。ここで

は私のコードです:

// --------- image loading 
std::experimental::filesystem::path path(pathstr); 
gil::rgb8_image_t img; 
if (path.extension() == ".jpg" || path.extension() == ".jpeg" || path.extension() == ".png") 
{ 
    if (path.extension() == ".png") 
     gil::png_read_and_convert_image(path.string(), img); 
    else 
     gil::jpeg_read_and_convert_image(path.string(), img); 

    _width = static_cast<int>(img.width()); 
    _height = static_cast<int>(img.height()); 

    typedef decltype(img)::value_type pixel; 

    auto srcView = gil::view(img); 
    //auto view = gil::interleaved_view(
    // img.width(), img.height(), &*gil::view(img).pixels(), img.width() * sizeof pixel); 

    auto pixeldata = new pixel[_width * _height]; 

    auto dstView = gil::interleaved_view(
     img.width(), img.height(), pixeldata, img.width() * sizeof pixel); 

    gil::copy_pixels(srcView, dstView); 
} 

// ---------- texture loading 
{ 
    glBindTexture(GL_TEXTURE_2D, handle()); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 
     image.width(), image.height(), 
     0, GL_RGB, GL_UNSIGNED_BYTE, 
     reinterpret_cast<const void*>(image.data())); 
    glGenerateMipmap(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

そして、私の質感がある: original texture

それを実行すると、私のcodeXLデバッガはテクスチャになったことを私に報告します texture in opengl

他のすべてのテクスチャこのモデルの間違ったも。

答えて

2

技術的には、これはよくある質問です。基本的には、整列の問題にぶち当たっています。デフォルトでは(変更することができます)、OpenGLはイメージ行が4バイトの境界に揃うことを期待しています。画像データがこれと一致しない場合、この歪んだ結果が得られます。 glTexImage…へのコールの直前にglPixelStorei(GL_UNPACK_ALIGNMENT, 1);へのコールを追加すると、のトリックが行われます。 もちろん、イメージのメタデータから実際のアライメントを取得する必要があります。 (すべての変換行列は、デフォルトで、または正の決定因子を有していて残っている場合)

「逆さま」である画像は、OpenGLは低いにテクスチャの原点を置くことによって引き起こされるがを残しました。これは、アッパーが残っているほとんどの画像ファイルフォーマット(ただしすべてではない)とは異なります。垂直のテクスチャ座標を反転するだけで、あなたは金色になります。

+0

それは私にとって参考になります!ありがとうございます! – ChungkingExpress

関連する問題