OpenTK學習筆記


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空間位置變換
  1. 視圖矩陣
    表示觀察者或者是相機的位置以及朝向。架設相機的過程
    Matrix4 mx4 = Matrix4.LookAt(0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);
    前三個參數表示相機的位置,接下來的三個參數表示目標觀察點的位置(兩點確定了視線的方向),最后三個參數表示了相機的方 向。

    模型矩陣變換
    描述物體的位置
    模型視圖變換
    相機和物體是相對運動。所以一般用模型視圖矩陣類表示相機與物體的相對位置。

  2. 投影矩陣變換
    攝像機的視角以及視覺范圍。類似對角的操作
    通過定義平截頭體(視景體)

  3. 視口矩陣變換
    視口矩陣變換是一種偽變換,是將規范化的設備坐標進行縮放到視口的變換。類型沖印膠片的操作

簡單的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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM