zoukankan      html  css  js  c++  java
  • 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();
    
  • 相关阅读:
    PAT 1097. Deduplication on a Linked List (链表)
    PAT 1096. Consecutive Factors
    PAT 1095. Cars on Campus
    PAT 1094. The Largest Generation (层级遍历)
    PAT 1093. Count PAT's
    PAT 1092. To Buy or Not to Buy
    PAT 1091. Acute Stroke (bfs)
    CSS:word-wrap/overflow/transition
    node-webkit中的requirejs报错问题:path must be a string error in Require.js
    script加载之defer和async
  • 原文地址:https://www.cnblogs.com/MaFeng0213/p/7236784.html
Copyright © 2011-2022 走看看