opengl本身並不是乙個api,僅僅是乙個規範(specification)。
opengl規範嚴格規定了每個函式該如何執行,以及它們的輸出值。至於內部具體每個函式是如何實現(implement)的,將由opengl庫的開發者自行決定。
實際的opengl庫的開發者通常是顯示卡的生產商。
opengl的一大特性就是對擴充套件(extension)的支援,當乙個顯示卡公司提出乙個新特性或者渲染上的大優化,通常會以擴充套件的方式在驅動中實現。
使用擴充套件的**大多看上去如下:
opengl自身是乙個巨大的狀態機(state machine):一系列的變數描述opengl此刻應當如何執行(如材質設定、光照設定、紋理設定)。if(gl_arb_extension_name)
else
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 ;
這一小段**展現了你以後使用opengl時常見的工作流:// 建立物件
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);
引用: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...