LearnOpenGL學習筆記(六) 紋理單元

2022-09-06 17:06:10 字數 1785 閱讀 6862

#version 330 core

out vec4 fragcolor;

in vec3 ourcolor;

in vec2 texcoord;

uniform sampler2d ourtexture;

void main()

在剛才的程式中,關於片段著色器的中我們宣告了乙個取樣器(sampler),一般來講我們需要用gluniform1i()函式進行將紋理物件(資料),從cpu中傳入視訊記憶體中的著色器這樣乙個過程。但是現實是我們沒有這麼做,我們只是在主函式裡繫結了目標,就自動傳入到片段著色器裡面了。這就是我們忽視的乙個概念——紋理單元。

乙個紋理的位置值通常稱為乙個紋理單元(texture unit)。之所以我們沒有去用gluniform1i()函式,是因為乙個紋理的預設紋理單元是0,它是預設的啟用紋理單元。

如果我們只傳入乙個紋理物件,那麼倒是不用擔心紋理單元的問題,反正自動傳入,你繫結就好了。但是當有多個紋理物件要傳入的時候,我們必須指定紋理物件,然後再主函式用gluniform1i()函式乙個乙個對接到著色器內部完畢,否則一切就亂套了。

紋理單元的主要目的是讓我們在著色器中可以使用多於乙個的紋理。

使用gluniform1i設定取樣器:

使用gluniform1i()函式作為著色器內部和程式溝通的橋梁需要知道兩件事情,乙個是在著色器內部接受資訊的物件為位置

(layout)。乙個是外界的資料物件。嚴格來講傳入資料本身也不是這個函式做的,這個函式是告訴著色器那個紋理物件對應哪個取樣

器物件。至於傳入這個是沒有函式對應的,就是啟用紋理物件,繫結紋理物件,啟用下乙個紋理物件,繫結下乙個物件。就可以告訴計算

機全部了。glactivetexture(gl_texture0);// 在繫結紋理之前先啟用紋理單元

glbindtexture(gl_texture_2d, texture);

渲染之前設定:

ourshader.use();//

別忘記在啟用著色器前先設定uniform!gluniform1i(glgetuniformlocation(ourshader.id, "texture1"), 0);//

手動設定ourshader.setint("texture2", 1);//

或者使用著色器類設定while(...)

渲染過程中:

glactivetexture(gl_texture0);

glbindtexture(gl_texture_2d, texture1);

glactivetexture(gl_texture1);

glbindtexture(gl_texture_2d, texture2);

glbindvertexarray(vao);

gldrawelements(gl_********s, 6, gl_unsigned_int, 0);

//

glbindtexture函式呼叫會繫結這個紋理到當前啟用的紋理單元,紋理單元gl_texture0預設總是被啟用,所以我們在前面的例子

裡當我們使用glbindtexture的時候,無需啟用任何紋理單元。

LearnOpenGL學習筆記 五 變換

openggl中對物體的變換是通過矩陣物件來實現的,需要掌握一些最基本的矩陣運算相關知識。include include include我們需要定義頂點著色器,使能夠接收乙個mat4的uniform矩陣,通過變換矩陣左乘位置向量,就可以實現對圖形的變換。version 330 core layout...

LearnOpenGL筆記6光照

last 鏡面光照 現實生活中看到某一物體的顏色並不是這個物體真正擁有的顏色,而是它所反射的 reflected 顏色。換句話說,那些不能被物體所吸收 absorb 的顏色 被拒絕的顏色 就是我們能夠感知到的物體的顏色。當我們把光源的顏色與物體的顏色值相乘,所得到的就是這個物體所反射的顏色 也就是我...

Learn OpenGL基礎書籍推薦

關於opengl的學習資料 c語言我覺得是最值得任何程式設計師花大量的時間學習的語言.原因是 c語言不在可能隨著時間的變化而產生太大的變動,最多也就是一點修修補補.可以說是一朝學會,終生受用 c語言是簡約的,就32個關鍵字,但是基本上現在任何語言都直接或者間接的構建在c語言之上.linux,wind...