OpenGL ES學(xué)習(xí)筆記(三):基本數(shù)據(jù)類型及繪制流程

基本數(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上

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市搞坝,隨后出現(xiàn)的幾起案子搔谴,更是在濱河造成了極大的恐慌,老刑警劉巖瞄沙,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件己沛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡距境,警方通過查閱死者的電腦和手機(jī)申尼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垫桂,“玉大人师幕,你說我怎么就攤上這事∥芴玻” “怎么了霹粥?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疼鸟。 經(jīng)常有香客問我后控,道長(zhǎng),這世上最難降的妖魔是什么空镜? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任浩淘,我火速辦了婚禮捌朴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘张抄。我一直安慰自己砂蔽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布署惯。 她就那樣靜靜地躺著左驾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪极谊。 梳的紋絲不亂的頭發(fā)上诡右,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音怀酷,去河邊找鬼稻爬。 笑死嗜闻,一個(gè)胖子當(dāng)著我的面吹牛蜕依,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琉雳,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼样眠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了翠肘?” 一聲冷哼從身側(cè)響起檐束,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎束倍,沒想到半個(gè)月后被丧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绪妹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年甥桂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邮旷。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黄选,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婶肩,到底是詐尸還是另有隱情办陷,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布律歼,位于F島的核電站民镜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏险毁。R本人自食惡果不足惜制圈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一植旧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧离唐,春花似錦病附、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嵌戈,卻和暖如春覆积,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熟呛。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工宽档, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庵朝。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓吗冤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親九府。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椎瘟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容