今天在做glsl
渲染yuv
圖像時(shí)姨蟋,因?yàn)閷?duì)glActiveTexture
和glBindTexture
的不熟,遇到了麻煩。經(jīng)過試驗(yàn),有了新的理解耙册,并基于此理解解決了問題撕阎。
之前用到紋理,都是傳GL_RGB
或者GL_RGBA
類型的數(shù)據(jù)進(jìn)去的路狮,只需要使用一張紋理,完全不用設(shè)置glActiveTexture
的,所以對(duì)glActiveTexture
的理解很淺
渲染yuv就不同了绰筛。
ffmpeg解碼出來的yuv一般是以yuv420p
的格式,分別存放在AVFrame->data
二維數(shù)組中描融。其中
data[0] => y
data[1] => u
data[2] => v
這樣格式的數(shù)據(jù)铝噩,需要使用三張紋理,分別傳輸?shù)斤@卡中窿克。
glBindTexture
我的理解是骏庸,glBindTexture(GL_TEXTURE_2D, tex_id)
有以下幾個(gè)涵義:
- 表示 tex_id是一個(gè)二維紋理毛甲,設(shè)置過一次后,tex_id的類型就不可變了
-
opengl
采用狀態(tài)機(jī)的設(shè)計(jì)具被,glBindTexture
告訴opengl說玻募,我選擇tex_id作為當(dāng)前紋理,后續(xù)對(duì)紋理的操作都將作用在此紋理上一姿。
glActiveTexture
我們已經(jīng)通過·glGenTextures在顯卡上開辟了一張紋理七咧, 然后使用
glBindTexture將該紋理選為當(dāng)前操作目標(biāo), 接著也調(diào)用了
glTexParameter`函數(shù)族設(shè)置了紋理的屬性
那么問題來了啸蜜,紋理是怎么和glsl
上的sampler2D
關(guān)聯(lián)起來的坑雅?
假如
假如是自己來設(shè)計(jì),會(huì)怎么設(shè)計(jì):
將
glGenTextures
生成的tex_id
賦值給sampler2D
變量就好了
實(shí)際上
我也不理解為什么衬横。實(shí)際上opengl
在這塊關(guān)聯(lián)上繞了下路裹粤。
紋理與sampler2D
變量的關(guān)聯(lián)是通過索引來關(guān)聯(lián)的。
我們可以給sampler2D
變量賦int值蜂林。
GLuint tex_loc = glGetUniformLocation(program, "tex");
glUniform1i(tex_loc, 1);
然后
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, tex_id);
將紋理與GL_TEXTURE1
關(guān)聯(lián)起來遥诉。
tex_id
與GL_TEXTUR1
關(guān)聯(lián)
GL_TEXTURE1
又與值為1
的sampler2D
變量關(guān)聯(lián)
所以tex_id
就這樣間接地與sampler2D
變量關(guān)聯(lián)了
Q&A
平時(shí)使用單張紋理怎么不需要glActiveTexture
?
sampler2D
默認(rèn)值為0,紋理也默認(rèn)與GL_TEXTURE0
關(guān)聯(lián)噪叙。