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í)目標(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