代碼
//紋理(材質(zhì))加載函數(shù)
unsigned int loadTexture(const char* path)
{
unsigned int textureID;
glGenTextures(1, &textureID);
int width, height, nrComponents;
unsigned char* data = stbi_load(path, &width, &height, &nrComponents, 0);
if (data)
{
GLenum format;
if (nrComponents == 1)
format = GL_RED;
else if (nrComponents == 3)
format = GL_RGB;
else if (nrComponents == 4)
format = GL_RGBA;
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
stbi_image_free(data);
}
else
{
std::cout << "Texture failed to load at path: " << path << std::endl;
stbi_image_free(data);
}
return textureID;
}
代碼解釋
- OpenGL的對象在創(chuàng)建時通常需要一個unsigned int類型的變量,將該變量與OpenGL創(chuàng)建出的對象進行綁定朗徊,綁定后可以將該變量看作是所創(chuàng)建的OpenGL對象的一個引用
- stbi_load:stb_image庫提供的函數(shù)快骗,可以讀取多種格式的柵格文件數(shù)據(jù)娜庇,并返回圖像的寬度、高度和顏色通道維度方篮,這些都是OpenGL綁定紋理所需要的參數(shù)
- glBindTexture:將紋理對象綁定到target name上
- glTexImage2D:將讀取的圖像數(shù)據(jù)轉(zhuǎn)換為OpenGL的紋理數(shù)據(jù)
- glGenerateMipmap:MipMap操作名秀,詳細見計算機圖形學入門
- glTexParameteri:設置紋理的環(huán)繞參數(shù);因為紋理坐標的范圍通常是從(0, 0)到(1, 1)藕溅,所以需要開發(fā)者處理紋理坐標設置在范圍之外的情況匕得;第一個參數(shù)指定了紋理目標,第二個參數(shù)指定設置的選項和應用的紋理軸蜈垮,第三個參數(shù)傳遞一個環(huán)繞方式,可供選擇的環(huán)繞方式有4種裕照,分別是:
- GL_REPEAT:對紋理的默認行為攒发。重復紋理圖像
- GL_MIRRORED_REPEAT:和GL_REPEAT一樣,但每次重復圖片是鏡像放置的
- GL_CLAMP_TO_EDGE:紋理坐標會被約束在0到1之間晋南,超出的部分會重復紋理坐標的邊緣惠猿,產(chǎn)生一種邊緣被拉伸的效果
- GL_CLAMP_TO_BORDER:超出的坐標為用戶指定的邊緣顏色
- stbi_image_free:釋放data占用的緩存
- 最后返回紋理的ID即可使用