OpenGL學習(3) 簡單介紹

2022-08-13 02:27:13 字數 1646 閱讀 5169

opengl本身並不是乙個api,僅僅是乙個規範(specification)。

opengl規範嚴格規定了每個函式該如何執行,以及它們的輸出值。至於內部具體每個函式是如何實現(implement)的,將由opengl庫的開發者自行決定。

實際的opengl庫的開發者通常是顯示卡的生產商。

opengl的一大特性就是對擴充套件(extension)的支援,當乙個顯示卡公司提出乙個新特性或者渲染上的大優化,通常會以擴充套件的方式在驅動中實現。

使用擴充套件的**大多看上去如下:

if(gl_arb_extension_name)

else

opengl自身是乙個巨大的狀態機(state machine):一系列的變數描述opengl此刻應當如何執行(如材質設定、光照設定、紋理設定)。

opengl的狀態通常被稱為opengl上下文(context)。我們通常使用如下途徑去更改opengl狀態:設定選項,操作緩衝。最後,我們使用當前opengl上下文來渲染。

假設當我們想告訴opengl去畫線段而不是三角形的時候,我們通過改變一些上下文變數來改變opengl狀態,從而告訴opengl如何去繪圖。一旦我們改變了opengl的狀態為繪製線段,下乙個繪製命令就會畫出線段而不是三角形。

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

opengl庫是用c語言寫的,同時也支援多種語言的派生。由於c的一些語言結構不易被翻譯到其它的高階語言,因此opengl開發的時候引入了一些抽象層。「物件(object)」就是其中乙個。

在opengl中乙個物件是指一些選項的集合,它代表opengl狀態的乙個子集。可以把物件看做乙個c風格的結構體(struct):

struct object_name ;
// opengl的狀態

struct opengl_context ;

// 建立物件

unsigned int objectid = 0;

glgenobject(1, &objectid);

// 繫結物件至上下文

glbindobject(gl_window_target, objectid);

// 設定當前繫結到 gl_window_target 的物件的一些選項

glsetobjectoption(gl_window_target, gl_option_window_width, 800);

glsetobjectoption(gl_window_target, gl_option_window_height, 600);

// 將上下文物件設回預設

glbindobject(gl_window_target, 0);

這一小段**展現了你以後使用opengl時常見的工作流:

引用:learnopengl cn

openGL學習 介紹和安裝

有幾個常用的學習opengl 首先,需要明確的是opengl不是乙個語言,它通常被認為是乙個圖形介面庫 提供了一堆的api介面 但是,更準確地說opengl本身並不是api,它僅僅是乙個規範。opengl規範是非常嚴格的,它規定了每個函式該如何執行,以及對應的輸出值。至於具體內部的每個函式是如何實現...

OpenGL3D例子詳細介紹

3d稜錐和立方體 立方體會繞著自己的乙個麵心自旋轉,與此同時稜錐和立方體會繞著豎軸公轉 應該是y軸,在opengl中是手性座標系,y軸朝上 效果圖如下 這個例子是我們的圖形學實驗的乙個例子,我會把重要的行數進行註解說明,其中有滑鼠互動函式是空函式體,並沒有進行呼叫,讀者可以自行研究,後續我可能會推出...

OpenGL學習筆記(3) 光照

opengl通過定義光源 材料和光照模型屬性來渲染光照物體,其中gl ambient gl diffuse gl specular屬性是光源和材料都有的,用gllight 可以分別設定光的環境強度 散射強度 鏡面強度,用glmaterial 可以分別設定環境的相對應的各個屬性,具體的解釋參見open...