OpenGL基礎2 OpenGL簡介

2021-10-05 02:25:22 字數 2534 閱讀 3478

小朋友你是否有很多問號,不知道為什麼需要這麼多複雜的方法,也不知道為什麼要這麼設計,更不知道僅僅顯示乙個點都那麼複雜,後面3d遊戲中的那麼精美的表現是否離自己很遠很遠……要不,再來一起看看opengl?

其實看到這裡,你應該也像我一樣,裝好了環境,並且成功開啟了第乙個視窗,又或者說已經可以開始繪製一些非常基礎的單元了,但是剛入門你應該也一樣,對著一堆方法一臉懵逼,看著講解和教程似乎也能理解,但是脫離教程就會發現自己一行**都弄不出來,還是需要不斷地去參考。

opengl

現在最高版本已經到 4.6 了,但是我們只要確保是 3.3 以後的版本即可,為什麼拿 3.3 版本做為分界?

早期的 opengl 使用立即渲染模式(immediate mode,也就是固定渲染管線),這個模式下繪製圖形很方便。opengl 的大多數功能都被庫隱藏起來,開發者很少能控制 opengl 如何進行計算的自由。

然開發者迫切希望能有更多的靈活性,隨著時間推移,規範越來越靈活,開發者對繪圖細節有了更多的掌控。立即渲染模式確實容易使用和理解,但是效率太低。因此從 opengl3.2 開始,規範文件開始廢棄立即渲染模式,推出核心模式(core-profile),這個模式完全移除了舊的特性。當使用 opengl 的核心模式時,opengl 迫使我們使用現代的函式。當我們試圖使用乙個已廢棄的函式時,opengl 會丟擲乙個錯誤並終止繪圖。

現代函式的優勢是更高的靈活性和效率,然而也更難於學習。立即渲染模式從 opengl 實際運作中抽象掉了很多細節,因而它易於學習的同時,也很難去把握 opengl 具體是如何運作的。現代函式要求使用者真正理解 opengl 和圖形程式設計,它有一些難度,然而提供了更多的靈活性,更高的效率,更重要的是可以更深入的理解圖形程式設計。

其實有個很好理解狀態機的方法:

我要紅色 → ok(給你換成了紅色的顏料桶)

我要畫條線 → ok(後面你要是給我3個點,我肯定不回給你畫個三角形出來)

我想啟用光照 → ok(儘管好像你只是畫個線段,要光照幹嘛)

我現在後悔了,想要綠色 → ok(沒問題,給你換)

……………… 過了好久好久

是的狀態機即使如此,除非有新的命令,否則永遠維持當前的狀態,當然這些狀態是有儲存的,我們也可以隨時查詢

當使用opengl的時候,我們會遇到一些狀態設定函式(state-changing function),這類函式將會改變上下文,以及狀態應用函式(state-using function),這類函式會根據當前 opengl 的狀態執行一些操作,只要知道 opengl 本質上是個大狀態機,就能更容易理解它的大部分特性

很明顯,glclearcolor 函式就是乙個狀態設定函式,而 glclear 函式則是乙個狀態應用的函式

前面已經一句話介紹過了,考慮到 glfw 其實就是 glut 的公升級版,glew 就是 glad 的公升級版,所以理論上我們只需要考慮 glfw 和 glew 就可以了

glfw是乙個專門針對opengl的c語言庫,它提供了一些渲染物體所需的最低限度的介面。它允許使用者建立opengl上下文,定義視窗引數以及處理使用者輸入

然而由於opengl驅動版本眾多,它大多數函式的位置都無法在編譯時確定下來,需要在執行時查詢,這樣特別的複雜和繁瑣,我們在每次使用函式前都需要進行類似的操作,因此就需要glew來幫我們簡化這個過程

glfw 部分

#pragma comment(lib,"glew32.lib")

#include#include#define glew_static

#include#includevoid key_callback(glfwwindow* window, int key, int scancode, int action, int mode)

const gluint width = 800, height = 600;

int main()

glfwmakecontextcurrent(window);

// set the required callback functions

glfwsetkeycallback(window, key_callback);

glewexperimental = gl_true;

// initialize glew to setup the opengl function pointers

if (glewinit() != glew_ok)

// define the viewport dimensions

int width, height;

glfwgetframebuffersize(window, &width, &height);

glviewport(1, 1, width, height);

// game loop

while (!glfwwindowshouldclose(window))

// terminate glfw, clearing any resources allocated by glfw.

glfwterminate();

return 0;

}

參考文獻:

OpenGL 學習2 OpenGL 狀態機

1 狀態變數型別是一些c資料型別的 typedef,有 glfloat,glboolean,glint,gluint 等等。2 狀態變數 狀態變數 讀取設定 兩種狀態變數 glisenabled gldisable 其他狀態變數 glget 大部分函式 3gl fill faceglpushattr...

OPENGL紋理基礎

對於vbo道理是一樣的 1.紋理座標 在繪製一條線段時,我們設定其中乙個端點為紅色,另乙個端點為綠色,則opengl會自動計算線段中其它各畫素的顏色,如果是使用glshademode gl smooth 則最終會形成一種漸變的效果 例如線段中點,就是紅色和綠色的中間色 類似的,在繪製一條線段時,我們...

OpenGL學習總結(2)

在opengl中,當我們需要繪製點 直線和多邊形時,我們需要用 點 來填充畫素,從而將影象顯示出來。因此,點 是一切的基礎,在opengl中,提供了一系列的函式來指定點,這些函式的共同點如下 都以glvertex為開頭,後面跟乙個數字和1 2個字母。例如 glvertex2d glvertex2f ...