OpenGL:纹理Textures
參考資料:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/
學(xué)習(xí)筆記,不一當(dāng)作參考教程,上面的參考資料是比較詳細(xì)的參考教程
文章目錄
- 生成紋理
- 生成紋理對象
- 綁定紋理對象
- 為綁定的紋理對象設(shè)置環(huán)繞,過濾方式
- 設(shè)置環(huán)繞
- 嘗試使用只對一個軸操作,和對兩個軸操作的不同之處
- 設(shè)置過濾方式
- 鄰近過濾
- 線性過濾
- 多級紋理
- 加載并生成紋理
- 應(yīng)用紋理
- 頂點(diǎn)著色器處理
- 片段著色器處理
- 設(shè)置多個紋理
- 補(bǔ)充
生成紋理
首先看一下生成紋理的代碼片段,有個整體認(rèn)識。
//生成紋理對象 unsigned int texture; glGenTextures(1, &texture); //綁定紋理對象 glBindTexture(GL_TEXTURE_2D, texture); // 為當(dāng)前綁定的紋理對象設(shè)置環(huán)繞、過濾方式 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); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 加載并生成紋理 int width, height, nrChannels; unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0); if (data) {glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);glGenerateMipmap(GL_TEXTURE_2D); } else {std::cout << "Failed to load texture" << std::endl; } stbi_image_free(data);生成紋理對象
同樣使用唯一ID引用的方法(需要了解以下怎么通過ID唯一引用的),和MFC的函數(shù)調(diào)用方式像不像
//生成紋理對象 unsigned int texture; glGenTextures(1, &texture);綁定紋理對象
//綁定紋理對象 glBindTexture(GL_TEXTURE_2D, texture);為綁定的紋理對象設(shè)置環(huán)繞,過濾方式
設(shè)置環(huán)繞
當(dāng)紋理坐標(biāo)超過了0-1范圍之后,OpenGL對紋理的處理。提供了四種方法,默認(rèn)是GL_REPEAT重復(fù)紋理。
實(shí)現(xiàn)這個紋理環(huán)繞需要通過以下函數(shù)
glTexParameter*函數(shù)對單獨(dú)的一個坐標(biāo)軸設(shè)置(s、t(如果是使用3D紋理那么還有一個r)它們和x、y、z是等價的)。
嘗試使用只對一個軸操作,和對兩個軸操作的不同之處
設(shè)置過濾方式
鄰近過濾
線性過濾
多級紋理
加載并生成紋理
需要使用一個第三方函數(shù)stb_image.hl這里幫忙加載紋理圖片,讀取數(shù)據(jù)。
注意使用這個頭文件時應(yīng)該如下:
注意讀入圖片的代碼有的會這樣寫,但是可能會報錯:
unsigned char *data = stbi_load(FileSystem::getPath("resources/textures/container.jpg").c_str(), &width, &height, &nrChannels, 0);應(yīng)用紋理
要想將生成的紋理應(yīng)用到圖形上,首先需要告訴OpenGL紋理映射坐標(biāo)(紋理圖像坐標(biāo)),其次是利用采樣器在對應(yīng)位置采樣紋理。
頂點(diǎn)著色器處理
在頂點(diǎn)上增加紋理映射坐標(biāo)信息,頂點(diǎn)屬性結(jié)構(gòu)如下:
用以下兩行代碼讀取紋理坐標(biāo)信息:
頂點(diǎn)著色器代碼如下,同樣增加一個紋理坐標(biāo)屬性。
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aColor; layout (location = 2) in vec2 aTexCoord;//紋理坐標(biāo)out vec3 ourColor; out vec2 TexCoord;void main() {gl_Position = vec4(aPos, 1.0);ourColor = aColor;TexCoord = aTexCoord; }片段著色器處理
片段著色器接受紋理坐標(biāo),以及全局變量,紋理圖像。
#version 330 core out vec4 FragColor;in vec3 ourColor; in vec2 TexCoord;uniform sampler2D ourTexture;void main() {FragColor = texture(ourTexture, TexCoord); }Sample采樣器,通過后綴1D 2D 3D決定是幾維圖像。
設(shè)置多個紋理
紋理單元:把紋理存在不同的位置(最多可以存16個)
通過激活不同的紋理單元實(shí)現(xiàn)對多個紋理的使用,需要按照對應(yīng)順序激活紋理。
一個紋理的默認(rèn)紋理單元是0,它是默認(rèn)的激活紋理單元,
多個紋理下的片段著色器:
#version 330 core ...uniform sampler2D texture1; uniform sampler2D texture2;void main() {FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2); }補(bǔ)充
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的OpenGL:纹理Textures的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL:着色器shader
- 下一篇: OpenGL 坐标变换