2016-11-19 81 views
1

我寫了一個簡單的應用程序,使用OpenGL,Assimp和Boost.GIL加載模型。使用Boost.GIL加載opengl紋理

我的模型包含PNG紋理。當我使用GIL加載它並通過OPENGL渲染時,我得到了錯誤的結果。感謝codeXL的powel,我發現我在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個字節邊界上對齊。如果你的圖像數據不符合這個,你會得到這個歪斜的結果。撥打glPixelStorei(GL_UNPACK_ALIGNMENT, 1);前加一個電話給glTexImage…就可以爲你做當然,您應該從圖像元數據中檢索實際對齊。

的圖像是「倒置」是通過把OpenGL的紋理的原點到左下(如果所有變換矩陣左在默認或具有正的決定簇)引起的。這與大多數圖像文件格式(但不是全部)不同,它們在上部左側。只要翻轉垂直紋理座標,你就是金。

+0

對我有幫助!!謝謝! – ChungkingExpress