OpenGL基礎(chǔ)概念(學(xué)習(xí)記錄)

各平臺(tái)渲染標(biāo)準(zhǔn):

win32 : OpenGL?,DirectX

android: Skia/Canvas ?(安卓SDK滑黔,2d) ,?OpenGL ES +NDK

mac/ios :Quartz2D,OpenGL ES?

Linux: OpenGL

wp7:DirectX

win8/wp8 : DirectX

游戲引擎基于的渲染標(biāo)準(zhǔn):

HTML5: Canvas/WebGL?

Unity3D:OpenGL

Cocos2d-x:OpenGL ES/DirectX/Canvas(Html5版本)

一、OpenGL初識(shí)

1朗儒、什么是OpenGL??一般認(rèn)為OpenGL是?一個(gè)圖形渲染庫(kù)摇肌,然?而并不不是烟零,OpenGL只是?包含了一系列操作圖形、圖像的函數(shù)的規(guī)范暴备。嚴(yán)格規(guī)定了每個(gè)函數(shù)如何執(zhí)行悠瞬,以及它 們的輸出值,而具體每個(gè)函數(shù)是如何實(shí)現(xiàn)的涯捻,是由顯卡開(kāi)發(fā)商自行決定的浅妆。 作為用戶不會(huì)感受到功能上的差異。

2障癌、代碼風(fēng)格OpenGL自身是一個(gè)巨大的狀態(tài)機(jī)凌外,OpenGL定義了很多狀態(tài)設(shè)置函

數(shù),通過(guò)設(shè)置函數(shù)參數(shù)的不同選項(xiàng)涛浙,達(dá)到不同的渲染效果康辑。

// 創(chuàng)建對(duì)象

unsigned int objectId = 0;

glGenObject(1, &objectId);

// 綁定對(duì)象至上下文

glBindObject(GL_WINDOW_TARGET, objectId);

// 設(shè)置當(dāng)前綁定到 GL_WINDOW_TARGET 的對(duì)象的一些選項(xiàng)

glSetObjectOption(GL_WINDOW_TARGET,GL_OPTION_WINDOW_WIDTH, 800);

glSetObjectOption(GL_WINDOW_TARGET,GL_OPTION_WINDOW_HEIGHT, 600);

//?將上下文對(duì)象設(shè)回默認(rèn)

glBindObject(GL_WINDOW_TARGET, 0);

3摄欲、GLFW庫(kù)

?? ? 跟系統(tǒng)相關(guān)的操作,如創(chuàng)建顯示窗口疮薇、處理用戶輸入胸墙、創(chuàng)建OpengGL上下文,不同的操作系統(tǒng)是不一樣的按咒,所以O(shè)penGL讓開(kāi)發(fā)者根據(jù)不同的平臺(tái)自己去處理迟隅。這些都有人會(huì)寫(xiě)好了, GLUT励七、SDL智袭、SFML、GLFM這些庫(kù)剛好提供了一個(gè)窗口和上下文用來(lái)渲染掠抬。

?? ? GLFW是一個(gè)專門(mén)針對(duì)OpenGL的C語(yǔ)言庫(kù)吼野,允許用戶創(chuàng)建上下文、定義窗口參數(shù)以及用戶輸入剿另。

4箫锤、GLAD

? ? ? OpenGL的函數(shù)的具體實(shí)現(xiàn)是由驅(qū)動(dòng)開(kāi)發(fā)商針對(duì)特定顯卡實(shí)現(xiàn)的。開(kāi)發(fā)者在調(diào)用每一個(gè)函數(shù)時(shí)需要運(yùn)行時(shí)獲取函數(shù)地址將其保存在一個(gè)函數(shù)指針中供以后使用雨女,如下:?

//?定義函數(shù)原型

typedef?void?(*GL_GENBUFFERS) (GLsizei, GLuint*);

//?找到正確的函數(shù)并賦值給函數(shù)指針

GL_GENBUFFERS glGenBuffers=(GL_GENBUFFERS)wglGetProcAddress(“glGenBuffers”);

//?現(xiàn)在函數(shù)可以被正常調(diào)用了

GLuint buffer;

glGenBuffers(1, &buffer);

這個(gè)操作使代碼復(fù)雜而且繁瑣谚攒。 GLAD是一個(gè)開(kāi)源的庫(kù),幫我們實(shí)現(xiàn)了運(yùn)行時(shí)查詢OpenGL函數(shù)實(shí)現(xiàn)的這個(gè)動(dòng)作氛堕。GLAD使用了一個(gè)在線服務(wù)(https://glad.dav1d.de/)馏臭,我們?cè)O(shè)置不同OpenGL版本的會(huì)得到相對(duì)應(yīng)的庫(kù)。加載這個(gè)庫(kù)讼稚, 我們就是可以直接使用如上glGenBuffers函數(shù)括儒,而無(wú)需寫(xiě)動(dòng)態(tài)查詢地址的代碼。

二锐想、OpenGL基礎(chǔ)概念


? ? 1帮寻、圖形渲染管線

?? ? ? ? 圖像渲染管線指的是一堆原始圖形數(shù)據(jù)途經(jīng)一個(gè)輸送管道,期間經(jīng)過(guò)各種變化處理最終出現(xiàn)在屏幕的過(guò)程赠摇。下圖是圖形渲染管線的每個(gè)階段的抽象展示固逗。藍(lán)色部分我們可以注入自定義的著色器。



2藕帜、頂點(diǎn)輸入

?? 頂點(diǎn)數(shù)組對(duì)象:Vertex Array Object烫罩,VAO

? 頂點(diǎn)緩沖對(duì)象:Vertex Buffer Object,VBO

GPU內(nèi)存中存儲(chǔ)大量頂點(diǎn)的對(duì)象洽故。使用這些對(duì)象可以一性發(fā)送大批數(shù)據(jù)到顯卡上供點(diǎn)著色器訪問(wèn)贝攒。

float vertices[] = {

? ? -0.5f, -0.5f, 0.0f,

? ? 0.5f, -0.5f, 0.0f,

? ? 0.0f,? 0.5f, 0.0f

};

//獲取一個(gè)頂點(diǎn)緩沖對(duì)象

unsigned int VBO,VAO;

glGenBuffers(1, &VBO);

glGenVertexArrays(1, &VAO);

//綁定緩沖對(duì)象

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);?

//將頂點(diǎn)數(shù)據(jù)復(fù)制到緩沖內(nèi)存中

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

//設(shè)置著色器獲取頂點(diǎn)數(shù)據(jù)的指針

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);


OpenGL的坐標(biāo)x、y时甚、z軸的坐標(biāo)范圍是(-1.0隘弊,1.0)

3哈踱、頂點(diǎn)著色器

?? ? ? 渲染管線的每一個(gè)階段運(yùn)行著自己的小程序,快速處理圖像數(shù)據(jù)长捧,這些小程序就叫做著色器嚣鄙。

?? ? ? GLSL: OpenGl著色器是用OpenGL著色器語(yǔ)言(OpenGL Shading Language)寫(xiě)成的吻贿。

? ? ? 頂點(diǎn)著色器:主要目的是將一種3D坐標(biāo)轉(zhuǎn)換為另外一種3D坐標(biāo)串结。同時(shí)允許我們對(duì)頂點(diǎn)屬性進(jìn)行一些基本處理。下面為一個(gè)簡(jiǎn)單GLSL頂點(diǎn)著色器的源代碼:?

#version 330 core

layout (location = 0) in vec3 aPos;

void main()

{

? ?gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);

}

3舅列、片段著色器

?? ? 片段著色器所做的事計(jì)算像素最后的顏色輸出肌割。輸出由RGBA4個(gè)分量組成,每個(gè)值的范圍是0.0-1.0之間帐要。?

#version 330 core

out vec4 FragColor;

void main()

{

? ? FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);

}

4把敞、著色器程序

? ? ? 我們需要對(duì)著色器源碼進(jìn)行編譯,并鏈接到一個(gè)著色器程序上榨惠,然后就可以使用著色器進(jìn)行渲染了奋早。?

//編譯頂點(diǎn)著色器

? ? unsigned int vertexShader;

? ? vertexShader = glCreateShader(GL_VERTEX_SHADER);

? ? glShaderSource(vertexShader,1,&vertexShaderSource,NULL);

? ? glCompileShader(vertexShader);

? ? ? //編譯片段著色器

? ? unsigned int fragmentShader1;

? ? fragmentShader1 =? glCreateShader(GL_FRAGMENT_SHADER);

? ? glShaderSource(fragmentShader1,1,&fragmentShaderSource1,NULL);

? ? glCompileShader(fragmentShader1);

上面的vertexShaderSource,fragmentShaderSource1可以定義為著色器代碼的字符串格式赠橙。

鏈接著色器程序耽装,獲取一個(gè)著色器程序?qū)ο?

//著色器程序

? ? unsigned int shaderProgram1;

? ? shaderProgram1? = glCreateProgram();

? ? glAttachShader(shaderProgram1,vertexShader);

? ? glAttachShader(shaderProgram1,fragmentShader1);

? ? glLinkProgram(shaderProgram1);

?設(shè)置渲染參數(shù),進(jìn)行渲染?

//設(shè)置好需要輸入的頂點(diǎn)

glBindVertexArray(VAO);

//設(shè)置好著色器程序

glUseProgram(shaderProgram1);

//畫(huà)三角形

glDrawArrays(GL_TRIANGLES, 0, 3);

5期揪、GLM庫(kù)

? ? ? GLM是OpenGL?Mathematics的縮寫(xiě)掉奄,它是一個(gè)只有頭文件的庫(kù)。 是一個(gè)數(shù)學(xué)庫(kù)凤薛,能夠滿足變換所需要的矩陣運(yùn)算姓建。

6、 紋理(Texture)

?? 紋理通常是一個(gè)2D圖片(也有3D的),用來(lái)豐富物體的細(xì)節(jié)缤苫。 紋理中包含了大量的數(shù)據(jù)速兔,并通過(guò)一定的方式給到著色器。通過(guò)測(cè)試活玲、混合等后期處理涣狗,可以渲染出炫酷的效果。

附:教程地址? https://learnopengl-cn.github.io/intro/?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載翼虫,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者屑柔。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市珍剑,隨后出現(xiàn)的幾起案子掸宛,更是在濱河造成了極大的恐慌,老刑警劉巖招拙,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唧瘾,死亡現(xiàn)場(chǎng)離奇詭異措译,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)饰序,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)领虹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人求豫,你說(shuō)我怎么就攤上這事塌衰。” “怎么了蝠嘉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵最疆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蚤告,道長(zhǎng)努酸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任杜恰,我火速辦了婚禮获诈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘心褐。我一直安慰自己舔涎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布檬寂。 她就那樣靜靜地躺著终抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桶至。 梳的紋絲不亂的頭發(fā)上昼伴,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音镣屹,去河邊找鬼圃郊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛女蜈,可吹牛的內(nèi)容都是我干的持舆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼伪窖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逸寓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起覆山,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竹伸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后簇宽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體勋篓,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吧享,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了譬嚣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钢颂。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拜银,靈堂內(nèi)的尸體忽然破棺而出殊鞭,到底是詐尸還是另有隱情,我是刑警寧澤盐股,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布钱豁,位于F島的核電站,受9級(jí)特大地震影響疯汁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卵酪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一幌蚊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溃卡,春花似錦溢豆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至犹赖,卻和暖如春队他,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峻村。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工麸折, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粘昨。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓垢啼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親张肾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芭析,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354