近來課程需要户辱,跟著learnopengl.com學(xué)習(xí)了opengl,在此將要點(diǎn)記錄以下糙臼。
學(xué)習(xí)網(wǎng)站:learnopengl(英文)learnopengl(中文)
一庐镐、OpenGL是什么
????????一般它被認(rèn)為是一個(gè)API(Application Programming Interface, 應(yīng)用程序編程接口),包含了一系列可以操作圖形变逃、圖像的函數(shù)必逆。然而,OpenGL本身并不是一個(gè)API韧献,它僅僅是一個(gè)由Khronos組織制定并維護(hù)的規(guī)范(Specification)末患。
????????OpenGL規(guī)范嚴(yán)格規(guī)定了每個(gè)函數(shù)該如何執(zhí)行,以及它們的輸出值锤窑。至于內(nèi)部具體每個(gè)函數(shù)是如何實(shí)現(xiàn)(Implement)的璧针,將由OpenGL庫的開發(fā)者自行決定(譯注:這里開發(fā)者是指編寫OpenGL庫的人)。
? ??????實(shí)際的OpenGL庫的開發(fā)者通常是顯卡的生產(chǎn)商渊啰。
? ? ? ? 簡言之探橱,OpenGL只是一個(gè)標(biāo)準(zhǔn)/規(guī)范,具體的實(shí)現(xiàn)是由驅(qū)動開發(fā)商針對特定顯卡實(shí)現(xiàn)的
? ??????所有版本的OpenGL規(guī)范文檔都被公開的寄存在Khronos那里绘证。例如OpenGL3.3規(guī)范文檔
二隧膏、核心模式與立即渲染模式(Core-profile vs Immediate mode)
? ? ? ? 早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管線)嚷那,從OpenGL3.2開始胞枕,規(guī)范文檔開始廢棄立即渲染模式,并鼓勵開發(fā)者在OpenGL的核心模式(Core-profile)下進(jìn)行開發(fā)魏宽,這個(gè)分支的規(guī)范完全移除了舊的特性腐泻。
三决乎、擴(kuò)展
? ??????OpenGL的一大特性就是對擴(kuò)展(Extension)的支持,當(dāng)一個(gè)顯卡公司提出一個(gè)新特性或者渲染上的大優(yōu)化派桩,通常會以擴(kuò)展的方式在驅(qū)動中實(shí)現(xiàn)构诚。
? ??????通過這種方式,開發(fā)者不必等待一個(gè)新的OpenGL規(guī)范面世铆惑,就可以使用這些新的渲染特性了范嘱。
? ??????通常,當(dāng)一個(gè)擴(kuò)展非常流行或者非常有用的時(shí)候员魏,它將最終成為未來的OpenGL規(guī)范的一部分丑蛤。
四、狀態(tài)機(jī)
? ??????OpenGL本質(zhì)上是個(gè)大狀態(tài)機(jī)撕阎。
? ? ? ? 關(guān)于狀態(tài)機(jī)的解釋:一系列的變量描述OpenGL此刻應(yīng)當(dāng)如何運(yùn)行盏阶。OpenGL的狀態(tài)通常被稱為OpenGL上下文(Context)。
? ??????狀態(tài)設(shè)置函數(shù)(State-changing Function):這類函數(shù)將會改變上下文闻书。
? ??????狀態(tài)使用函數(shù)(State-using Function):這類函數(shù)會根據(jù)當(dāng)前OpenGL的狀態(tài)執(zhí)行一些操作。
????????我們通常使用如下途徑去更改OpenGL狀態(tài):
? ? ? ? ①設(shè)置選項(xiàng)(setting some options)
? ? ? ? ②操作緩沖(manipulating some buffers)
????????最后脑慧,我們使用當(dāng)前OpenGL上下文來渲染(render using the current context)魄眉。
五、對象
? ??????OpenGL庫是用C語言寫的闷袒,同時(shí)也支持多種語言的派生坑律,但其內(nèi)核仍是一個(gè)C庫。
? ? ? ? 由于C的一些語言結(jié)構(gòu)不易被翻譯到其它的高級語言囊骤,因此OpenGL引入了一些抽象層晃择。
????????“對象(Object)”就是其中一個(gè)抽象概念。
? ??????在OpenGL中一個(gè)對象是指一些選項(xiàng)的集合也物,它代表OpenGL狀態(tài)(即OpenGL上下文)的一個(gè)子集宫屠。
? ??????可以把對象看做一個(gè)C風(fēng)格的結(jié)構(gòu)體(Struct):
? ??????當(dāng)我們使用一個(gè)對象時(shí),通郴牵看起來像如下一樣(把OpenGL上下文看作一個(gè)大的結(jié)構(gòu)體):
? ??????使用OpenGL時(shí)常見的工作流:
? ? ? ? ①首先創(chuàng)建一個(gè)對象浪蹂,然后用一個(gè)id保存它的引用(實(shí)際數(shù)據(jù)被儲存在后臺)
? ? ? ? ②然后我們將對象綁定至上下文的目標(biāo)位置
????????????(例子中窗口對象目標(biāo)的位置被定義成GL_WINDOW_TARGET)
? ? ? ? ③接下來我們設(shè)置窗口的選項(xiàng)。設(shè)置的選項(xiàng)將被保存在objectId所引用的對象中
? ? ? ? ④最后我們將目標(biāo)位置的對象id設(shè)回0告材,解綁這個(gè)對象
? ? ? ?因?yàn)橹霸O(shè)置的選項(xiàng)被保存在objectId所引用的對象中坤次, 一旦我們重新綁定這個(gè)對象到GL_WINDOW_TARGET位置,這些選項(xiàng)就會重新生效
? ??????使用對象的好處:
? ? ? ? 我們可以定義多個(gè)對象斥赋,每個(gè)對象都可以是不同的設(shè)置缰猴。在我們執(zhí)行一個(gè)使用OpenGL狀態(tài)的操作的時(shí)候,只需要綁定含有需要的設(shè)置的對象即可疤剑。