OpenGL ES _ 著色器_紋理圖像

OpenGL ES _ 入門(mén)_01
OpenGL ES _ 入門(mén)_02
OpenGL ES _ 入門(mén)_03
OpenGL ES _ 入門(mén)_04
OpenGL ES _ 入門(mén)_05
OpenGL ES _ 入門(mén)練習(xí)_01
OpenGL ES _ 入門(mén)練習(xí)_02
OpenGL ES _ 入門(mén)練習(xí)_03
OpenGL ES _ 入門(mén)練習(xí)_04
OpenGL ES _ 入門(mén)練習(xí)_05
OpenGL ES _ 入門(mén)練習(xí)_06
OpenGL ES _ 著色器 _ 介紹
OpenGL ES _ 著色器 _ 程序
OpenGL ES _ 著色器 _ 語(yǔ)法
OpenGL ES_著色器_紋理圖像
OpenGL ES_著色器_預(yù)處理
OpenGL ES_著色器_頂點(diǎn)著色器詳解
OpenGL ES_著色器_片斷著色器詳解
OpenGL ES_著色器_實(shí)戰(zhàn)01
OpenGL ES_著色器_實(shí)戰(zhàn)02
OpenGL ES_著色器_實(shí)戰(zhàn)03

學(xué)習(xí)是一件開(kāi)心的額事情

學(xué)習(xí)目標(biāo)

  • 理解紋理圖像的概念
  • 掌握紋理采樣器的類型和作用
  • 在GLSL 中如何使用紋理
  • 紋理緩沖區(qū)

紋理圖像

玩過(guò)游戲的同學(xué)們,都知道在游戲人物身上穿的那個(gè)叫皮膚,專業(yè)點(diǎn)將那個(gè)就叫做紋理圖像。GLSL 支持在頂點(diǎn)和片段著色器使用紋理圖像。

紋理采樣器的類型和作用

下面的這個(gè)表解釋了每種采樣器的作用,不需要記憶,使用時(shí),進(jìn)行查閱即可!

采樣器名稱 描述
sampler1D 訪問(wèn)1D 紋理圖像
isampler1D 訪問(wèn)1D 紋理圖像
usampler1D 訪問(wèn)1D 紋理圖像
sampler2D 訪問(wèn)2D 紋理圖像
isampler2D 訪問(wèn)2D 紋理圖像
usampler2D 訪問(wèn)2D 紋理圖像
sampler3D 訪問(wèn)3D 紋理圖像
isampler3D 訪問(wèn)3D 紋理圖像
usampler3D 訪問(wèn)3D 紋理圖像
samplerCube 訪問(wèn)立體紋理圖像
isamplerCube 訪問(wèn)立體紋理圖像
sampler1DArray 訪問(wèn)1D 紋理圖像數(shù)組
isampler1DArray 訪問(wèn)1D 紋理圖像像數(shù)組
usampler1DArray 訪問(wèn)1D 紋理圖像像數(shù)組
sampler2DArray 訪問(wèn)2D 紋理圖像數(shù)組
isampler2DArray 訪問(wèn)2D 紋理圖像像數(shù)組
usampler2DArray 訪問(wèn)2D 紋理圖像像數(shù)組
sampler2DRect 訪問(wèn)2D 紋理矩形
isampler2DRect 訪問(wèn)2D 紋理矩形
usampler2DRect 訪問(wèn)2D 紋理矩形
sampler1DShadow 訪問(wèn)1D 陰影紋理
isampler1DShadow 訪問(wèn)1D 陰影紋理
usampler1DShadow 訪問(wèn)1D 陰影紋理
samplerCubeShadow 訪問(wèn)立體紋理
samler1DArrayShadow 訪問(wèn)1D陰影紋理的一個(gè)數(shù)組
samler2DArrayShadow 訪問(wèn)2D陰影紋理的一個(gè)數(shù)組
samler2DRectShadow 訪問(wèn)2D陰影紋理矩陣
samplerBuffer 訪問(wèn)紋理緩沖區(qū)
isamplerBuffer 訪問(wèn)紋理緩沖區(qū)
usamplerBuffer 訪問(wèn)紋理緩沖區(qū)

如何使用

第一步.采樣器必須在著色器中聲明為uniform,切記他們的賦值必須來(lái)自應(yīng)用程序中,采樣器也可以作為函數(shù)的參數(shù),但必須是類型匹配的采樣器
第二步.采樣器在著色器中使用之前必須分配一個(gè)紋理單元,并且只能通過(guò)glUniformli()、glUniformliv() 進(jìn)行初始化(把采樣器應(yīng)該使用的紋理單元的索引作為參數(shù))

Glint texsampler;
texSampler = glGetUniformLocation(program,"tex ");
glUniformli(texSampler,2);

第三步 .在著色器內(nèi)部對(duì)一副問(wèn)題圖片進(jìn)行采樣時(shí),需要使用已經(jīng)聲明且與一個(gè)紋理單元相關(guān)聯(lián)的采樣器變量。舉個(gè)例子: 我們對(duì)一個(gè)與Sampler 2D 變量tex 相關(guān)聯(lián)的二維紋理圖像進(jìn)行采樣,并把采樣結(jié)果和片段顏色進(jìn)行組合,提供與在紋理環(huán)境下使用GL_MODULATE 模式相同的結(jié)果:

uniform sampler2D tex;
void main(){
    gl_fragColor = gl_color *texture2D(tex,gl_texCoord[0].st)
}
  • 依賴性紋理讀取
    先解釋一下,在一個(gè)使用紋理貼圖的著色器執(zhí)行過(guò)程中,需要使用紋理坐標(biāo)在紋理圖像中指定位置,并提取相應(yīng)的紋理單元的值。
    我們看看代碼怎么寫(xiě):
uniform sampler1D coords;
uniform sampler3D volume;
void main()
{
 vec3 texCoords = texture1D(coords,gl_TexCoord[0].s);
 vec3 volumeColor = texture3D(volume,texCoords);
}

紋理緩沖區(qū)

有個(gè)問(wèn)題先說(shuō)一下:盡管GLSL 使得數(shù)組可用,不管是在著色器中使用靜態(tài)初始值,還是作為值得集合呈現(xiàn)為uniform變量中的一個(gè)數(shù)組,在這兩個(gè)情況下,都有可能出現(xiàn)超出可用大小限制的數(shù)組.我們可能把這樣一個(gè)值得表存儲(chǔ)在一個(gè)紋理圖像中,然后,在紋理中操作紋理坐標(biāo)來(lái)訪問(wèn)想要訪問(wèn)的值。對(duì)于這個(gè)問(wèn)題,更加直接的解決方案是紋理緩沖區(qū),為什么這樣說(shuō)呢?紋理緩沖區(qū)是緩沖對(duì)象的一種特定的類型,類似于一維紋理,可以在說(shuō)色器中使用一個(gè)整數(shù)值來(lái)索引,但是,它提供了較為昂貴的紋理內(nèi)存的資源,因此支持較大的數(shù)據(jù)集合。
創(chuàng)建紋理緩沖區(qū)的步驟:
1.初始化數(shù)據(jù)
glBufferData()
2.把該緩沖區(qū)綁定到一個(gè)紋理緩沖區(qū)中
glTexBuffer()

void glTexBuffer(GLenum target,GLenum internalFormat,GLuint buffer)

把緩沖區(qū)對(duì)象buffer 和target 關(guān)聯(lián)起來(lái),這導(dǎo)致buffer 中的數(shù)據(jù)格式被解釋為擁有internalFormat 的格式.
target:必須為GL_TEXTURE_BUFFER
interalFormat 紋理格式:
GL_R8,GL_R16,GL_R16F,GL_R32F,GL_R81,GL_R16I,GL_R32I,GL_R81UI,GL_R16UI,GL_R32UI,GL_RG8,GL_RG16,GL_RG16F,GL_RG32F,GL_RG81,GL_RG16I,GL_RG32I,GL_RG8UI,GL_RG16UI,GL_RG32UI,GL_RGBA8,GL_RGBA16,GL_RGBA16F,GL_RGBA32F,GL_RGBA8I,GL_RGBA16I,GL_RGBA32I,GL_RGBA8UI,GL_RGBA16UI,GL_RGBA32UI
通過(guò)調(diào)用glActiveTexture() 來(lái)指定那個(gè)紋理單元和紋理緩沖區(qū)相關(guān)聯(lián)。

總結(jié)

紋理的使用在OpenGL 中是比較重要的一塊內(nèi)容,必須要掌握!
如有疑問(wèn):請(qǐng)加群:578734141

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容