基本數(shù)據(jù)類型
GLenum: 用于GL枚舉的無符號(hào)整型巾遭。通常用于通知OpenGL由指針傳遞的存儲(chǔ)于數(shù)組中數(shù)據(jù)的類型(例如宰衙,GL_FLOAT用于指示數(shù)組由GLfloat組成)平道。
GLboolean: 用于單布爾值。OpenGL ES還定義了其自己的“真”和“假”值(GL_TRUE和GL_FALSE)以避免平臺(tái)和語言的差別供炼。當(dāng)向OpenGL傳遞布爾值時(shí)一屋,請(qǐng)使用這些值而不是使用YES或NO(盡管由于它們的定義實(shí)際沒有區(qū)別,即使你不小心使用了YES或NO袋哼。但是冀墨,使用GL-定義值是一個(gè)好的習(xí)慣。)
GLbitfield: 用于將多個(gè)布爾值(最多32個(gè))打包到單個(gè)使用位操作變量的四字節(jié)整型涛贯。我們將在第一次使用位域變量時(shí)詳細(xì)介紹轧苫,請(qǐng)參閱 wikipedia
GLbyte: 有符號(hào)單字節(jié)整型,包含數(shù)值從-128 到 127
GLshort: 有符號(hào)雙字節(jié)整型疫蔓,包含數(shù)值從?32,768 到 32,767
GLint: 有符號(hào)四字節(jié)整型含懊,包含數(shù)值從?2,147,483,648 到 2,147,483,647
GLsizei: 有符號(hào)四字節(jié)整型,用于代表數(shù)據(jù)的尺寸(字節(jié))衅胀,類似于C中的size_t
GLubyte: 無符號(hào)單字節(jié)整型岔乔,包含數(shù)值從0 到 255。
GLushort: 無符號(hào)雙字節(jié)整型滚躯,包含數(shù)值從0 到 65,535
GLuint: 無符號(hào)四字節(jié)整型雏门,包含數(shù)值從0 到 4,294,967,295
GLfloat: 四字節(jié)精度IEEE 754-1985 浮點(diǎn)數(shù)
GLclampf: 這也是四字節(jié)精度浮點(diǎn)數(shù),但OpenGL使用GLclampf特別表示數(shù)值為0.0 到 1.0
GLvoid:void值用于指示一個(gè)函數(shù)沒有返回值掸掏,或沒有參數(shù)
GLfixed: 定點(diǎn)數(shù) 使用整型數(shù)存儲(chǔ)實(shí)數(shù)茁影。由于大部分計(jì)算機(jī)處理器在處理整型數(shù)比處理浮點(diǎn)數(shù)快很多,這通常是對(duì)3D系統(tǒng)的優(yōu)化方式丧凤。但因?yàn)閕Phone具有用于浮點(diǎn)運(yùn)算的矢量處理器募闲,我們將不討論定點(diǎn)運(yùn)算或GLfixed數(shù)據(jù)類型。
GLclampx: 另一種定點(diǎn)型愿待,用于使用定點(diǎn)運(yùn)算來表示0.0 到 1.0之間的實(shí)數(shù)浩螺。正如GLfixed,我們不會(huì)討論或使用它仍侥。
存儲(chǔ)修飾符
const:本地變量只能使用存儲(chǔ)修飾符const要出。函數(shù)參數(shù)只能用const。函數(shù)返回值類型和結(jié)構(gòu)體字段不要使用const农渊。命名的編譯時(shí)常量可以用const聲明患蹂。任何使用const聲明的變量在其所屬的著色器中均是只讀的。將變量聲明為常量可以減少使用硬連線的數(shù)字常數(shù)。const可以用來修飾任何基本數(shù)據(jù)類型传于。通常const變量在聲明的同時(shí)要進(jìn)行初始化囱挑。
attribute:用于聲明通過OpenGL ES應(yīng)用程序傳遞到頂點(diǎn)著色器中的變量值。在其它任何非頂點(diǎn)著色器的著色器中聲明attribute變量是錯(cuò)誤的格了。在頂點(diǎn)著色器被程序使用之前看铆,attribute變量是只讀的徽鼎。attribute變量的值通過OpenGL ES頂點(diǎn)API或者作為頂點(diǎn)數(shù)組的一部分被傳進(jìn)頂點(diǎn)著色器盛末。它們傳遞頂點(diǎn)屬性值到頂點(diǎn)著色器,并且在每一個(gè)運(yùn)行的頂點(diǎn)著色器中都會(huì)改變否淤。attribute修飾符只能修飾float, vec2, vec3, vec4,mat2,mat3,mat4悄但。attribute變量不能聲明為數(shù)組或結(jié)構(gòu)體,如 attribute vec4 position;石抡。
uniform:修飾符用來修飾那些在整個(gè)圖元被處理的過程中保持不變的全局變量檐嚣。所有的uniform變量都是只讀的,可以通過應(yīng)用程序調(diào)用API命令初始化啰扛,或者通過OpenGL ES間接初始化嚎京。
varying:提供了頂點(diǎn)著色器,片元著色器和二者通訊控制模塊之間的接口隐解。頂點(diǎn)著色器計(jì)算每個(gè)頂點(diǎn)的值(如顏色鞍帝,紋理坐標(biāo)等)并將它們寫到varying變量中。頂點(diǎn)著色器也會(huì)從varying變量中讀值煞茫,獲取和它寫入相同的值帕涌。如果從頂點(diǎn)著色器中讀取一個(gè)尚未被寫入的varying變量,將返回未定義值续徽。
參數(shù)修飾符
函數(shù)參數(shù)修飾符有如下幾種:
(1)in蚓曼,作為函數(shù)的傳入?yún)?shù)
(2)out,作為函數(shù)的傳出參數(shù)
(3)inout钦扭,即作為傳入?yún)?shù)纫版,又作為傳出參數(shù)
默認(rèn)情況下為in
精度修飾符
精度:用于存儲(chǔ)和展示浮點(diǎn)數(shù)、整數(shù)變量的范圍和精度依賴于數(shù)值的源(varying客情,uniform捎琐,紋理查找,等等)裹匙,是不是頂點(diǎn)或者片元著色器瑞凑,還有其他一些底層實(shí)現(xiàn)的細(xì)節(jié)。
頂點(diǎn)語言必須提供一種至少16位概页,加上一個(gè)符號(hào)位的整數(shù)精度
籽御。
片元語言提供與頂點(diǎn)著色器相同的浮點(diǎn)數(shù)范圍和精度是很有必要的,但不是必須的。這就需要片元語言提供的浮點(diǎn)數(shù)的范圍至少是(-16384技掏,+16384)铃将,精度至少是1024。
片元語言必須提供一種至少10為哑梳,加上一個(gè)符號(hào)位的整數(shù)精度劲阎。
精度修飾符:任何浮點(diǎn)數(shù)或者整數(shù)聲明前面都可以添加如下精度修飾符:
舉例:lowp float color;varying mediump vec2 Coord;lowp ivec2 foo(lowp mat3);highp mat4 m;
精度修飾符聲明了底層實(shí)現(xiàn)存儲(chǔ)這些變量必須要使用的最小范圍和精度。實(shí)現(xiàn)可能會(huì)使用比要求更大的范圍和精度鸠真,但絕對(duì)不會(huì)比要求少悯仙。
以下是精度修飾符要求的最低范圍和精度:
基本繪制流程
1.創(chuàng)建一個(gè)OpenGL ES 上下文
EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2; //使用OpenGL ES 2.0版本
_context = [[EAGLContext alloc] initWithAPI:api]; //創(chuàng)建上下文
if (!_context) {
NSLog(@"Failed to initialize OpenGLES 2.0 context");
exit(1);
}
if (![EAGLContext setCurrentContext:_context]) { //設(shè)定上下文
NSLog(@"Failed to set current OpenGL context");
exit(1);
}
</br>
2.綁定Renderbuffers
glGenRenderbuffers(1, &_colorRenderBuffer); //創(chuàng)建一個(gè)新的render buffer object,用于存放渲染過的圖像吠卷。這里返回一個(gè)唯一的integer來標(biāo)記render buffer(這里把這個(gè)唯一值賦值到_colorRenderBuffer)锡垄。有時(shí)候你會(huì)發(fā)現(xiàn)這個(gè)唯一值被用來作為程序內(nèi)的一個(gè)OpenGL 的名稱。
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer); //告訴OpenGL:我在后面引用GL_RENDERBUFFER的地方祭隔,其實(shí)是想用_colorRenderBuffer货岭。其實(shí)就是告訴OpenGL,我們定義的buffer對(duì)象是屬于哪一種OpenGL對(duì)象
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; //為render buffer分配空間
</br>
3.綁定FrameBuffer
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, _colorRenderBuffer); // 把前面創(chuàng)建的buffer render依附在frame buffer的GL_COLOR_ATTACHMENT0位置上疾渴。
</br>
4.渲染
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0); //設(shè)置一個(gè)RGB顏色和透明度
glClear(GL_COLOR_BUFFER_BIT); //“填色”動(dòng)作千贯,GL_COLOR_BUFFER_BIT聲明要清理那個(gè)緩沖區(qū)
[_context presentRenderbuffer:GL_RENDERBUFFER]; //將緩沖區(qū)(render buffer和color buffer)的顏色呈現(xiàn)到UIView上