一、什么是OpenGL
OpenGL(Open Graphics Library)是一個(gè)跨編程語言、跨平臺(tái)的編程圖形程序接口,它將計(jì)算機(jī)的資源抽象稱為“OpenG的對象”,將資源的操作抽象為“OpenGL指令”。
OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三維圖形 API 的子集,針對手機(jī)、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì),去除了許多不必要和性能較低的API接口。
本文介紹的OpenGL是基于OpenGLES 3.0的版本,也是目前覆蓋率最高的OpenGL版本,目前被廣泛運(yùn)用在各種終端設(shè)備上。
OpenGL是圖形API,因此可以說所有的運(yùn)算和結(jié)果最終都是需要通過圖像進(jìn)行輸出。既然要繪圖,那必然就需要有一塊畫板,幀緩沖區(qū)就是OpenGL中的畫板。但是特別需要注意的是,幀緩沖區(qū)不是常規(guī)意義緩沖區(qū),它并不是實(shí)際存儲(chǔ)數(shù)據(jù)的對象,類似畫畫的時(shí)候,需要在畫板上放一塊畫布,才能實(shí)際在畫布上進(jìn)行繪畫,這些畫布可以是紋理(Texture)或者是渲染緩沖區(qū)(RenderBuffer),而放置這些畫布的位置被稱為幀緩沖區(qū)的附著(Attachment)。
二、核心配置文件與新引入的功能
OpenGL 3.3引入了核心配置文件的概念,它允許開發(fā)者使用一套簡化的API來構(gòu)建應(yīng)用程序,同時(shí)提供了更加現(xiàn)代化的圖形特性。這些核心配置文件摒棄了過時(shí)的OpenGL功能,強(qiáng)化了著色器語言GLSL的能力,并推動(dòng)開發(fā)者向更加靈活的編程模式轉(zhuǎn)變。
例如,核心配置文件3.3包含了: - 頂點(diǎn)數(shù)組對象(VAO) - 核心著色器程序(通過GLSL編寫) - 多重采樣抗鋸齒(MSAA)的使用
這些特性為開發(fā)者提供了更高的性能和更大的靈活性,但同時(shí)需要開發(fā)者更深入地理解OpenGL的內(nèi)部工作原理
三、核心特性在現(xiàn)代圖形編程中的應(yīng)用
核心模式的核心特性為現(xiàn)代圖形編程帶來了一系列優(yōu)勢: - 著色器可以根據(jù)需要自定義,提供更復(fù)雜的視覺效果。 - 紋理和頂點(diǎn)緩沖對象(VBOs)的使用減少了對顯存的浪費(fèi),提升了渲染效率。 - 使用核心特性可以更有效地利用現(xiàn)代顯卡的并行處理能力。
使用核心模式編程時(shí),開發(fā)者需要管理許多底層細(xì)節(jié),如設(shè)置頂點(diǎn)屬性指針、配置視口、進(jìn)行著色器編譯和鏈接等。下面的代碼片段展示了如何使用核心模式創(chuàng)建一個(gè)簡單的OpenGL程序。
// 創(chuàng)建并綁定頂點(diǎn)數(shù)組對象
GLuint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
// 創(chuàng)建和配置頂點(diǎn)緩沖對象(VBO)
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 配置頂點(diǎn)屬性指針
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 解綁VBO和VAO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// 渲染循環(huán)
while (!glfwWindowShouldClose(window)) {
glDrawArrays(GL_TRIANGLES, 0, 3);
// 其他渲染邏輯...
}
四、如何搭建OpenGL環(huán)境
要搭建可運(yùn)行的opengl環(huán)境,需要一下幾個(gè)部分:
C++運(yùn)行環(huán)境
如果使用Windows電腦,我們推薦使用Microsoft Visual Studio ;如果在Mac上,我們推薦使用Xcode.
OpenGL/GLSL
要使用GL肯定要配置可用的GL庫了,具體如何配置的在這就不詳細(xì)介紹了
MacOS 出廠應(yīng)默認(rèn)安裝,可直接使用
窗口管理庫
OpenGL實(shí)際上并不是把圖像直接繪制到計(jì)算機(jī)屏幕上,而是將之渲染到一個(gè)幀緩沖區(qū),然后由計(jì)算機(jī)來負(fù)責(zé)把幀緩沖區(qū)中的內(nèi)容繪制到屏幕上的一個(gè)窗口中。有不少庫都可以支持這一部分工作。一個(gè)選擇是使用操作系統(tǒng)提供的窗口管理功能,比如Microsoft Windows API。但這通常不實(shí)用,因?yàn)樾枰芏嗟讓拥木幋a工作。GLUT庫曾經(jīng)是一個(gè)很流行的選擇,但現(xiàn)在已經(jīng)被棄用了。它的一個(gè)現(xiàn)代化的變體是freeglut庫。其他相關(guān)的選項(xiàng)還有CPW庫、GLOW庫、GLUI庫等。
GLFW是最流行的選擇之一,它內(nèi)置了對Windows、macOS、Linux和其他操作系統(tǒng)的支持。它可以在其官網(wǎng)下載,并且需要在要使用它的計(jì)算機(jī)上編譯。
GLFW的安裝: windows同樣可以參考上邊鏈接,macos建議使用homebrew進(jìn)行安裝。