[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()函式,可詳細報錯
坑3:SOIL_load_image函式只可以載入PNG圖片不可以載入JPG圖片,報錯:JPEG format not supported (progressive)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);
解決辦法:請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影象應該是都能很好的顯示出來