OpenGL定義
OpenGL被定義為”圖形硬件的一種軟件接口”.實質上是3D圖形和模型庫,具有高度可移植性,具有非常快的速度。
OpenGL架構
術語pipeline常用於闡述彼此緊密聯系的一系列事件
管線(pipeline)是一個過程,可能涉及兩個或多個獨特的階段或步驟。應用程序進行OpenGL函數調用時,這些命令被放置在一個命令緩沖區,該緩沖區最終填滿了命令,定點數據,紋理等東西,緩沖區被刷新時,命令和數據就傳遞給下一個階段
OpenGL Application(應用程序): Geometry (幾何),texture(紋理)
↓
Vertex data (頂點數據):lighting(光照),transform(變換),scale(縮放)
↓
Geometry(幾何):Rasterization(光柵),clipping(剪裁)
↓
Fragment(段):frog(霧) ,texture(紋理)
↓
Framebuffer(幀緩沖區):Stencil(蒙版),alpha(透明度),z-tests(深度測試),blending(混合)
↓
Eyeballs(眼球)
OpenGL坐標
屏幕坐標系:橫軸是X軸,縱軸是Y軸,分別向右是正方向,向下是正方向,原點在左上角。
數學坐標系:原點在左下方,向上是X軸的正方向
OpenGL3D坐標系: 與數學坐標系相似,左下角是原點,向右和向上是正值。添加第三個量Z軸。z軸方向從屏幕內部指向屏幕外部。
OpenGL空間位置變換
-
視圖矩陣
表示觀察者或者是相機的位置以及朝向。架設相機的過程
Matrix4 mx4 = Matrix4.LookAt(0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);
前三個參數表示相機的位置,接下來的三個參數表示目標觀察點的位置(兩點確定了視線的方向),最后三個參數表示了相機的方 向。
模型矩陣變換
描述物體的位置
模型視圖變換
相機和物體是相對運動。所以一般用模型視圖矩陣類表示相機與物體的相對位置。 -
投影矩陣變換
攝像機的視角以及視覺范圍。類似對角的操作
通過定義平截頭體(視景體) -
視口矩陣變換
視口矩陣變換是一種偽變換,是將規范化的設備坐標進行縮放到視口的變換。類型沖印膠片的操作
簡單的OpenGL 操作順序
/// 1.控件OnCreate方法中
// 設置清屏色
GL.ClearColor(Color.SkyBlue); // 設置清屏色
/// 2. Resize方法中
// 1. 設置視口
GL.Viewport(0, 0, c.ClientSize.Width, c.ClientSize.Height);
// 2. 操縱投影矩陣,設置平截頭體(比例通常和視口比例相同,否則輸出畫面會走樣)
//矩陣模式,投影矩陣,openGL基於狀態機
GL.MatrixMode(MatrixMode.Projection);
// 加載單位矩陣,重置矩陣的狀態
GL.LoadIdentity();
// 設置平截頭體(視景體)
GL.Frustum(-aspect_ratio, aspect_ratio, -1.0f, 1.0f, 3.0f, 7.0f); // 創建平截頭體
// 另外一種方法
//Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4,aspect_ratio,1.0f,100.0f);
//GL.LoadMatrix(ref perpective);
/// 3. Paint或者DrawFrame()方法中
// 清除顏色緩沖區
GL.Clear(ClearBufferMask.ColorBufferBit);
// 操縱模型視圖矩陣,設置眼球參數
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
// 設置觀察者參數
Matrix4 mx4 = Matrix4.LookAt(0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadMatrix(ref mx4);
// 繪制圖形
GL.Begin(BeginMode.Polygon);
GL.Vertex3(-1.0f, -1.0f, 2.0f);
GL.Vertex3(1.0f, -1.0f, 2.0f);
GL.Vertex3(1.0f, 1.0f, 2.0f);
GL.Vertex3(-1.0f, 1.0f, 2.0f);
GL.End();
// 交換緩沖區
glControl1.SwapBuffers();