1. 程式人生 > >[MAC]OpenGL中SOIL庫與stbi_load庫載入圖片,透明黑色問題,遇到的坑及解決辦法

[MAC]OpenGL中SOIL庫與stbi_load庫載入圖片,透明黑色問題,遇到的坑及解決辦法

介於網上和SOIL相關的問題並不多,記錄下自己遇到的問題

坑1: SOIL庫的下載及連結,加-m64與加x86的方法都試過,無法解決load_image函式的問題

解決辦法:刪除官方下載的SOIL庫。然後在終端下,git clone https://github.com/DeVaukz/SOIL,(具體mac下如何克隆下載github檔案自行google)

然後用cmake(cmake的用法在配置GLFW和GLEW的時候應該已經會用cmake了)按照同樣方法配置SOIL庫,則在usr/local/include以及usr/local/lib中會

出現相應SOIL檔案,然後在xcode中#include<SOIL/SOIL.h>即可

坑2:SOIL庫函式沒問題,檔案路徑引數可以直接將圖片拖進xcode,執行沒問題,但是沒影象

解決辦法:使用SOIL_last_result()函式,可詳細報錯

unsigned char *image = SOIL_load_image("/Users/momo/Desktop/1.png", &texwidth, &texheight, 0, SOIL_LOAD_RGB);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texwidth, texheight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
    if(image){
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texwidth, texheight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else
        std::cout<<SOIL_last_result()<<std::endl;
    SOIL_free_image_data(image);
    glBindTexture(GL_TEXTURE_2D,0);
坑3:SOIL_load_image函式只可以載入PNG圖片不可以載入JPG圖片,報錯:JPEG format not supported (progressive)

解決辦法:請google:standard jpeg for image,該函式對於JPG影象只支援標準JPEG格式,就算你載入成功了,影象顯示灰色且右邊被扭曲,所以採用stbi_load庫,

這是learnopengl採用stbi_load庫寫的另一個教程版本:stbi_load庫版opengl教程

坑4:SOIL_load_image函式載入PNG函式的時候,透明部分被顯示成黑色

解決辦法;高階OPENGL-混合參考opengl教程中高階OPENGL之混合部分片段著色器程式碼,

因為最後用的stbi_load庫,所以文章後面會貼上stbi_load解決透明問題的程式碼版本

坑5:在上述stbi_load庫的opengl教程中,下載stb_image.h標頭檔案時可能又需要各種Google,這個不再贅述,但是教程中的程式碼是存在問題的,貼上我的程式碼:

    int texwidth,texheight,nrChannels;//nrChannels表示通道數,R/G/B/A,一共4個通道,有些圖片只有3個,A即為alpha
    stbi_set_flip_vertically_on_load(true);   //解決影象翻轉問題,不需要像SOIL庫中片段著色器的position設定為-y
    unsigned char *image = stbi_load("/Users/momo/Desktop/圖片/jpeg-home.jpg", &texwidth, &texheight, &nrChannels,STBI_rgb_alpha);//注意這裡不是0
    if(image){
        if(nrChannels==3)//rgb 適用於jpg影象
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texwidth, texheight, 0,GL_RGBA, GL_UNSIGNED_BYTE, image);//後面一個是RGBA
        else if(nrChannels==4)//rgba 適用於png影象
            glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA, texwidth, texheight, 0,GL_RGBA, GL_UNSIGNED_BYTE, image);//注意,兩個都是RGBA
        //std::cout<<nrChannels<<std::endl;
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else
        std::cout<<"Failed to load texture"<<std::endl;
    stbi_image_free(image);
    glBindTexture(GL_TEXTURE_2D,0);

片段著色器程式碼:主要參考混合那一章的講述

const GLchar *FragmentShaderSource="#version 330 core\n"
"in vec3 ourColor;\n"
"in vec2 TexCoord;\n"
"out vec4 color;\n"
"uniform sampler2D ourTexture;\n"
"void main()\n"
"{\n"
"    vec4 texColor=texture(ourTexture,TexCoord);\n"
"    if(texColor.a<0.5)\n"
"        discard;\n"
"    color=texColor;\n"
"}\n";

glTexture2D函式中,前一個GL_RGB指的是你希望儲存為的格式,後一個GL_RGB是源影象自帶的格式,有些JPG影象帶有alpha資訊,有些不帶

至此,PNG影象和JPG影象應該是都能很好的顯示出來