OpenGL學(xué)習(xí)日志 001

OpenGL ES 學(xué)習(xí)日志。

本文將學(xué)習(xí)OpenGL ES (超級寶典)記錄下的日志翩迈,將同步到簡書上,歡迎大家批評盔夜,順便說一句负饲,這本書 是第五版,俗稱喂链,藍(lán)寶書

總結(jié)的幾個名詞返十,僅供個人參考。

  1. 渲染 : 將數(shù)學(xué)和圖形數(shù)據(jù)轉(zhuǎn)換成3D空間圖像的操作叫做渲染椭微。
  2. Transformation(變換) -- 通過變換洞坑,或者說旋轉(zhuǎn) 這些點(diǎn),并在他們之間繪制線段蝇率,我們就能在一個2D屏幕上創(chuàng)造出一個3D的世界錯覺迟杂。
  3. 光柵化(Rasterization)實(shí)際繪制或填充每個點(diǎn)之間的像素,形成的線段就叫光刪化本慕。
  4. 紋理貼圖(個人理解就是圖片 貼合在繪制的2D圖形上)
  5. 混合(個人理解就是將兩個不同顏色的圖片疊在一起逢慌,然后重疊的那個顏色 (當(dāng)然了透明度肯定不是100%))
  6. 3D幾何圖形無非是將頂點(diǎn)間的點(diǎn)連接起來,然后對三角形進(jìn)行光刪化间狂。而使得對對象變得有實(shí)體。變換火架,著色鉴象,紋理與混合。
  7. 還有一個很重要的概念就是(三維笛卡爾坐標(biāo)系)--- 因?yàn)樽x書的時候并沒有好好學(xué)習(xí)何鸡,所以纺弊,在理解笛卡爾三維坐標(biāo)系上有很大的難度,但是網(wǎng)上有篇文章寫的非常的清楚 網(wǎng)址在 "http://www.360doc.com/content/14/0302/15/13998280_357087559.shtml" 利用 太極骡男,兩儀淆游,四象,八卦 來分析笛卡爾三維坐標(biāo)系。其實(shí)把二維笛卡爾坐標(biāo)系作為一個面犹菱,然后再加上一個坐標(biāo)系拾稳,Z 使其成為一個立體的圖形。
支持陣容

GLUT :框架腊脱,OpenGL 的主要的編程框架访得。
GLEW :開源庫
GLTools:包含了一個用語言操作矩陣向向量的3D 數(shù)學(xué)庫。

變量類型 和 字節(jié)長度陕凹。
OepnGL數(shù)據(jù)類型 最小位寬 描述
GLBoolean 1 真 or 假
GLbyte 8 有符號的八位整數(shù)
GLubyte 8 無符號的八位整數(shù)
GLChar 8 字符串
GLShort 16 有符號16位整數(shù)
GLuShort 16 無符號16位整數(shù)
GLhalf 16 半精度浮點(diǎn)數(shù)
GLint 32 有符號的32位整數(shù)
GLuint 32 無符號的32位整數(shù)
GLSizei 32 無符號的32位整數(shù)
GLunem 32 無符號的32位整數(shù)
GLFloat 32 32位浮點(diǎn)數(shù)
GLclampf 32 【0 - 1】范圍內(nèi)的32位浮點(diǎn)數(shù)
GLbitfield 32 32位
GLdouble 64 64位雙精度
GLclampd 64 【0 - 1】64位雙精度
GLint64 64 有符號64位整數(shù)
GLuint64 64 無符號64位整數(shù)
GLSizeiptr 本地操作系統(tǒng)指針大小 無符號整數(shù)
GLinptr 本地操作系統(tǒng)指針大小 有符號整數(shù)
GLSync 本地操作系統(tǒng)指針大小 同步對象句柄

openGL 并沒有對指針和數(shù)組做特殊的考慮悍抑。我們可參考C語言聲明一個100個GLshort變量的數(shù)組

GLShort shorts[100];

聲明一個長度為100的指向 GLDouble 類型變量的指針數(shù)組

GLdouble *doubles[10];

OpenGL 錯誤

openGL 在內(nèi)部保留了一組錯誤標(biāo)志(共4個)其中每個標(biāo)志代表著一種不同的數(shù)據(jù)類型的錯誤,當(dāng)一個錯誤發(fā)生時杜耙,與這個錯誤相對應(yīng)的標(biāo)志就會被設(shè)置搜骡,可以調(diào)用 glGetError 這個函數(shù)

GLunem glGetError(void);

通常情況下,我們需要在循環(huán)中調(diào)用 上面的函數(shù)佑女,直到返回 GL_NO_ERROR 為止

錯誤代碼 描述
GL_INVALID_ENUM 枚舉參數(shù)超出范圍
GL_INVALID_VALUE 數(shù)值參數(shù)超出范圍
GL_INVALID_OPERATION 在當(dāng)前狀態(tài)中操作非法
GL_OUT_OF_MEMORY 沒有足夠的內(nèi)存來執(zhí)行這條命令
GL_NO_ERROR 沒有錯誤出現(xiàn)

OpenGL查詢版本號 和 生產(chǎn)商有關(guān)的特定的信息

const GLubyte *glGetString(GLEnum name)

上面的的函數(shù)返回一個靜態(tài)的字符串记靡,描述GL 函數(shù)庫中所請求的信息。

OpenGL 實(shí)用glHint獲取線索

glHint函數(shù)允許我們制定片中于視覺質(zhì)量還是速度珊豹,以適應(yīng)各種不同類型的操作簸呈,簡而言之 就是(速度 和 質(zhì)量的 選擇)

void glHint (GLenum target.GLEnum mode)

繪制第一個三角形

//  Created by 張孝江 on 2020/10/8.
//

#define GL_SILENCE_DEPRECATION //為了解除警告的宏。
#include <GLShaderManager.h>
#include <GLUT/GLUT.h>
#include <GLTools.h>

//批處理
GLBatch batch;
//渲染
GLShaderManager shaderManager;
#pragma mark - 定義視口的大小 /窗口里面包含視口/店茶。改變視口并不會改變坐標(biāo)系蜕便,
void changeWindowsSize(GLint width , GLint height){
    glViewport(0, 0,  width, height);
    printf("改變后的寬是%d\n,改變后的高是%d",width,height);
}
#pragma mark - 設(shè)置程序的一些屬性
void setupRC(){
    ///設(shè)置程序窗口的顏色,
    glClearColor(0, 0, 1, 1);
    ///初始化著色器
    shaderManager.InitializeStockShaders();
    ///設(shè)置三角形的頂點(diǎn)數(shù)據(jù) //從左到右贩幻。 因?yàn)?我們渲染的是一個三角形轿腺,所以 Y 軸的 點(diǎn)都為0.
    //坐標(biāo)是以屏幕的中心為原點(diǎn)的。左邊- 右邊+ 上+ 下- 丛楚,這樣子就會有八個象限 立體來說族壳。中國古人對于空間的理解是 混沌(點(diǎn)) -> 太極(線)->四象 -(平面 (笛卡爾 2D坐標(biāo)系))-> 八卦(笛卡爾3D 坐標(biāo)系。)
    //此外趣些,還有 左手坐標(biāo)系仿荆,和 右手坐標(biāo)系。
    GLfloat vVters[] = {
        //三角形第一個點(diǎn)在三維笛卡爾坐標(biāo)系的位置
        -0.5,-0.0f,-0.0f,
        //三角形第二個點(diǎn)在三維笛卡爾坐標(biāo)系的位置
        0.0f,0.5f,0.0f,
        //三角形第三個點(diǎn)在三維笛卡爾坐標(biāo)系的位置
        0.5f,0.0f,0.0f,
    };
    //處理數(shù)據(jù)
    batch.Begin(GL_TRIANGLES, 3);
    batch.CopyVertexData3f(vVters);
    batch.End();
    
}
#pragma mark //畫屏幕
void RenderScene (void){
    //清除緩沖區(qū)的內(nèi)容
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    //設(shè)置三角形的填充顏色坏平。
    GLfloat vred[] = {1.0f,0.0f,0.0f,1.0f};
    //傳遞到存儲著色器拢操,即GLT_SHADER_IDENITY 著色器
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vred);
    //提交著色器
    batch.Draw();
    //將在后臺緩沖區(qū)進(jìn)行渲染 然后交換到前臺
    glutSwapBuffers();
}

//按鍵使視圖進(jìn)行變化
void specilalkeys(int key,int x,int y){
    GLfloat c = 0.25f;
    GLfloat vVters[] = {
        -0.5,0.0f,0.0f,
        0.0f,0.5f,0.0f,
        0.5f,0.0f,0.0f,
    };
        
    if (key == GLUT_KEY_UP) {
        vVters[4] +=c;
    }
    if (key == GLUT_KEY_DOWN) {
        vVters[4] -=c;
    }
    if (key == GLUT_KEY_LEFT) {
        vVters[0]-=c;
    }
    if (key == GLUT_KEY_RIGHT) {
        vVters[0]+=c;
    }
    batch.CopyVertexData3f(vVters);
    glutPostRedisplay();

}


///main 函數(shù)
int main(int argc,char * argv[])
{
    /*設(shè)置當(dāng)前的工作目錄 (針對macOS)*/
    gltSetWorkingDirectory(argv[0]);
    /*初始化GLUT*/
    glutInit(&argc, argv);
    /*初始化雙緩沖窗口,其中標(biāo)志GLUT_DOUBLE舶替、GLUT_RGBA令境、GLUT_DEPTH、GLUT_STENCIL分別指
     雙緩沖窗口顾瞪、RGBA顏色模式舔庶、深度測試抛蚁、模板緩沖區(qū)*/
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
    /*設(shè)置初始值窗口大小*/
    glutInitWindowSize(313,218);
    /*設(shè)置窗口的標(biāo)題*/
    glutCreateWindow("我的第一個三角形");
    /*注冊回調(diào)函數(shù) 此函數(shù)可監(jiān)聽窗口大小的改變 切 glView*/
    glutReshapeFunc(changeWindowsSize);
    /*注冊函數(shù)回調(diào) 繪制屏幕 上面函數(shù)一旦發(fā)生改變,下面的函數(shù)就立刻執(zhí)行繪制惕橙。*/
    glutDisplayFunc(RenderScene);
    /*為了讓其移動注冊回調(diào)函數(shù)*/
    glutSpecialFunc(specilalkeys);
    /*驅(qū)動程序初始化過程中可能遇到的問題瞧甩。說上有說名*/
    GLenum err = glewInit();
    if(GLEW_OK != err) {
        fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
        return 1;
    }
    /*繪制三角形*/
    setupRC();
    glutMainLoop();
    return 0;
    
}





最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吕漂,隨后出現(xiàn)的幾起案子亲配,更是在濱河造成了極大的恐慌,老刑警劉巖惶凝,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼虎,死亡現(xiàn)場離奇詭異,居然都是意外死亡苍鲜,警方通過查閱死者的電腦和手機(jī)思灰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混滔,“玉大人洒疚,你說我怎么就攤上這事∨饔欤” “怎么了油湖?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長领跛。 經(jīng)常有香客問我乏德,道長,這世上最難降的妖魔是什么吠昭? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任喊括,我火速辦了婚禮,結(jié)果婚禮上矢棚,老公的妹妹穿的比我還像新娘郑什。我一直安慰自己,他們只是感情好蒲肋,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布蘑拯。 她就那樣靜靜地躺著,像睡著了一般兜粘。 火紅的嫁衣襯著肌膚如雪强胰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天妹沙,我揣著相機(jī)與錄音,去河邊找鬼熟吏。 笑死距糖,一個胖子當(dāng)著我的面吹牛玄窝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悍引,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼恩脂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趣斤?” 一聲冷哼從身側(cè)響起俩块,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浓领,沒想到半個月后玉凯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡联贩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年漫仆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泪幌。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡盲厌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祸泪,到底是詐尸還是另有隱情吗浩,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布没隘,位于F島的核電站懂扼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏升略。R本人自食惡果不足惜微王,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望品嚣。 院中可真熱鬧炕倘,春花似錦、人聲如沸翰撑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眶诈。三九已至涨醋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逝撬,已是汗流浹背浴骂。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宪潮,地道東北人溯警。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓趣苏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梯轻。 傳聞我的和親對象是個殘疾皇子食磕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361

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