• 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();
    
  • 相关阅读:
    最新 Cocos2d-x 3.2 开发环境搭建(windows环境下)
    Apache OFbiz entity engine源代码解读
    Android 标签控件
    标准红外遥控的接收程序-松瀚汇编源程序
    uva 10548
    char* 和char[]的差别
    依据波形的转折点文件,转换成波形文件
    spring 中StoredProcedure的使用方法
    JMS的样例
    JavaScript高级编程
  • 原文地址:https://www.cnblogs.com/MaFeng0213/p/7236784.html
Copyright © 2020-2023  润新知