OpenGL ES _ 入門_01
OpenGL ES _ 入門_02
OpenGL ES _ 入門_03
OpenGL ES _ 入門_04
OpenGL ES _ 入門_05
OpenGL ES _ 入門練習_01
OpenGL ES _ 入門練習_02
OpenGL ES _ 入門練習_03
OpenGL ES _ 入門練習_04
OpenGL ES _ 入門練習_05
OpenGL ES _ 入門練習_06
OpenGL ES _ 著色器 _ 介紹
OpenGL ES _ 著色器 _ 程序
OpenGL ES _ 著色器 _ 語法
OpenGL ES_著色器_紋理圖像
OpenGL ES_著色器_預處理
OpenGL ES_著色器_頂點著色器詳解
OpenGL ES_著色器_片斷著色器詳解
OpenGL ES_著色器_實戰(zhàn)01
OpenGL ES_著色器_實戰(zhàn)02
OpenGL ES_著色器_實戰(zhàn)03
學習目標
- 理解紋理圖像的概念
- 掌握紋理采樣器的類型和作用
- 在GLSL 中如何使用紋理
- 紋理緩沖區(qū)
紋理圖像
玩過游戲的同學們,都知道在游戲人物身上穿的那個叫皮膚,專業(yè)點將那個就叫做紋理圖像抄谐。GLSL 支持在頂點和片段著色器使用紋理圖像。
紋理采樣器的類型和作用
下面的這個表解釋了每種采樣器的作用扰法,不需要記憶蛹含,使用時,進行查閱即可!
采樣器名稱 | 描述 |
---|---|
sampler1D | 訪問1D 紋理圖像 |
isampler1D | 訪問1D 紋理圖像 |
usampler1D | 訪問1D 紋理圖像 |
sampler2D | 訪問2D 紋理圖像 |
isampler2D | 訪問2D 紋理圖像 |
usampler2D | 訪問2D 紋理圖像 |
sampler3D | 訪問3D 紋理圖像 |
isampler3D | 訪問3D 紋理圖像 |
usampler3D | 訪問3D 紋理圖像 |
samplerCube | 訪問立體紋理圖像 |
isamplerCube | 訪問立體紋理圖像 |
sampler1DArray | 訪問1D 紋理圖像數(shù)組 |
isampler1DArray | 訪問1D 紋理圖像像數(shù)組 |
usampler1DArray | 訪問1D 紋理圖像像數(shù)組 |
sampler2DArray | 訪問2D 紋理圖像數(shù)組 |
isampler2DArray | 訪問2D 紋理圖像像數(shù)組 |
usampler2DArray | 訪問2D 紋理圖像像數(shù)組 |
sampler2DRect | 訪問2D 紋理矩形 |
isampler2DRect | 訪問2D 紋理矩形 |
usampler2DRect | 訪問2D 紋理矩形 |
sampler1DShadow | 訪問1D 陰影紋理 |
isampler1DShadow | 訪問1D 陰影紋理 |
usampler1DShadow | 訪問1D 陰影紋理 |
samplerCubeShadow | 訪問立體紋理 |
samler1DArrayShadow | 訪問1D陰影紋理的一個數(shù)組 |
samler2DArrayShadow | 訪問2D陰影紋理的一個數(shù)組 |
samler2DRectShadow | 訪問2D陰影紋理矩陣 |
samplerBuffer | 訪問紋理緩沖區(qū) |
isamplerBuffer | 訪問紋理緩沖區(qū) |
usamplerBuffer | 訪問紋理緩沖區(qū) |
如何使用
第一步.采樣器必須在著色器中聲明為uniform塞颁,切記他們的賦值必須來自應用程序中浦箱,采樣器也可以作為函數(shù)的參數(shù),但必須是類型匹配的采樣器
第二步.采樣器在著色器中使用之前必須分配一個紋理單元祠锣,并且只能通過glUniformli()酷窥、glUniformliv() 進行初始化(把采樣器應該使用的紋理單元的索引作為參數(shù))
Glint texsampler;
texSampler = glGetUniformLocation(program,"tex ");
glUniformli(texSampler,2);
第三步 .在著色器內(nèi)部對一副問題圖片進行采樣時,需要使用已經(jīng)聲明且與一個紋理單元相關(guān)聯(lián)的采樣器變量伴网。舉個例子: 我們對一個與Sampler 2D 變量tex 相關(guān)聯(lián)的二維紋理圖像進行采樣蓬推,并把采樣結(jié)果和片段顏色進行組合,提供與在紋理環(huán)境下使用GL_MODULATE 模式相同的結(jié)果:
uniform sampler2D tex;
void main(){
gl_fragColor = gl_color *texture2D(tex,gl_texCoord[0].st)
}
- 依賴性紋理讀取
先解釋一下,在一個使用紋理貼圖的著色器執(zhí)行過程中澡腾,需要使用紋理坐標在紋理圖像中指定位置沸伏,并提取相應的紋理單元的值。
我們看看代碼怎么寫:
uniform sampler1D coords;
uniform sampler3D volume;
void main()
{
vec3 texCoords = texture1D(coords,gl_TexCoord[0].s);
vec3 volumeColor = texture3D(volume,texCoords);
}
紋理緩沖區(qū)
有個問題先說一下:盡管GLSL 使得數(shù)組可用动分,不管是在著色器中使用靜態(tài)初始值毅糟,還是作為值得集合呈現(xiàn)為uniform變量中的一個數(shù)組,在這兩個情況下长赞,都有可能出現(xiàn)超出可用大小限制的數(shù)組.我們可能把這樣一個值得表存儲在一個紋理圖像中弦讽,然后撩轰,在紋理中操作紋理坐標來訪問想要訪問的值。對于這個問題迹辐,更加直接的解決方案是紋理緩沖區(qū),為什么這樣說呢甚侣?紋理緩沖區(qū)是緩沖對象的一種特定的類型右核,類似于一維紋理,可以在說色器中使用一個整數(shù)值來索引渺绒,但是贺喝,它提供了較為昂貴的紋理內(nèi)存的資源,因此支持較大的數(shù)據(jù)集合宗兼。
創(chuàng)建紋理緩沖區(qū)的步驟:
1.初始化數(shù)據(jù)
glBufferData()
2.把該緩沖區(qū)綁定到一個紋理緩沖區(qū)中
glTexBuffer()
void glTexBuffer(GLenum target,GLenum internalFormat,GLuint buffer)
把緩沖區(qū)對象buffer 和target 關(guān)聯(lián)起來躏鱼,這導致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
通過調(diào)用glActiveTexture() 來指定那個紋理單元和紋理緩沖區(qū)相關(guān)聯(lián)。
總結(jié)
紋理的使用在OpenGL 中是比較重要的一塊內(nèi)容殷绍,必須要掌握!
如有疑問:請加群:578734141