zoukankan      html  css  js  c++  java
  • OpenGL第二节:绘制多个颜色四边形

    LOpengGL.h://和前一节一样。

    LUtil.h://添加

    const int COLOR_MODE_CYAN = 0;//定义两个颜色选择
    const int COLOR_MODE_MULTI = 1;

    void handleKeys( unsigned char key, int x, int y );//按键处理函数。根据按键去切换颜色

    LUtil.cpp://添加

    int gColorMode = COLOR_MODE_CYAN;
    GLfloat gProjectionScale = 1.f;//投影缩放比例

    bool initGL()//添加glOrtho
    {

      glMatrixMode(GL_PROJECTION);//设置为投影矩阵
      glLoadIdentity();//加载单位矩阵,和前一句一起,意思是设置投影矩阵为单位矩阵。
      //glOrtho将当前矩阵(也就是投影矩阵)和二维正交矩阵相乘,用于控制缩放大小的。如果是三维调用gluPerspective() 或者 glFrustum()方法
      glOrtho( 0.0, SCREEN_WIDTH * gProjectionScale, SCREEN_HEIGHT * gProjectionScale, 0.0, 1.0, -1.0 );//参数分别对应左,右,下,上,近,远

      ......

      //这里说明一下投影矩阵,模型矩阵分别干什么的:

      //投影矩阵是用于控制几何视图的,简单来说,也就是外观、大小、形状。比如调用glOrtho()方法进行缩放

      //模型矩阵是用于控制几何位置的,比如移动、旋转、翻转、倾斜等等。比如调用glTranslatef()方法移动位置

      //那么OpenGL是怎么使用矩阵将多边形转为像素,然后进行渲染的呢?

      //首先,模型矩阵负责进行各种移动、旋转、翻转、倾斜等操作,然后投影矩阵负责读取各个顶点、运算,将顶点转换为OpenGL使用的对应的视图坐标,然后连接,然后填充颜色也就是光栅化。

      //总的来说就是使用ProjectionMatrix * ModelviewMatrix * Vertex 这三样东西完成将对应的顶点取出并光栅化为像素的。

    }

    void update()//不变
    {

    }

    void render()
    {
      glClear(GL_COLOR_BUFFER_BIT);//清屏幕

      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();//这两句重置模型矩阵为单位矩阵

      glTranslatef(SCREEN_WIDTH / 2.f, SCREEN_HEIGHT / 2.f, 0.f);//然后移动到屏幕中心位置

      if (gColorMode == COLOR_MODE_CYAN)
      {
        glBegin(GL_QUADS);//使用同一种颜色
        glColor3f(0.f, 1.f, 1.f);
        glVertex2f(-50.f, -50.f);
        glVertex2f(50.f, -50.f);
        glVertex2f(50.f, 50.f);
        glVertex2f(-50.f, 50.f);
        glEnd();
      }
      else
      {
        glBegin(GL_QUADS);
        glColor3f(1.f, 0.f, 0.f); glVertex2f(-50.f, -50.f);//每一点使用一种颜色
        glColor3f(1.f, 1.f, 0.f); glVertex2f(50.f, -50.f);
        glColor3f(0.f, 1.f, 0.f); glVertex2f(50.f, 50.f);
        glColor3f(0.f, 0.f, 1.f); glVertex2f(-50.f, 50.f);
        glEnd();
      }

      glutSwapBuffers();//更新屏幕
    }

    void handleKeys(unsigned char key, int x, int y)
    {
    if (key == 'q')//按下键盘q键切换颜色
    {
      if (gColorMode == COLOR_MODE_CYAN)
      {
        gColorMode = COLOR_MODE_MULTI;
      }
      else
      {
        gColorMode = COLOR_MODE_CYAN;
      }
    }
    else if (key == 'e')//按下e键进行缩放,改变大小
    {
      if (gProjectionScale == 1.f)
      {
        gProjectionScale = 2.f;
      }
      else if (gProjectionScale == 2.f)
      {
        gProjectionScale = 0.5f;
      }
      else if (gProjectionScale == 0.5f)
      {
        gProjectionScale = 1.f;
      }

      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();//和上一句一起,重置投影矩阵为单位矩阵
      glOrtho(0.0, SCREEN_WIDTH * gProjectionScale, SCREEN_HEIGHT * gProjectionScale, 0.0, 1.0, -1.0);//然后进行缩放操作
    }
    }

    main.cpp:

    void runMainLoop(int val){//不变

    }

    int main( int argc, char* args[] )

    {

      ...

      glutKeyboardFunc( handleKeys );//添加键盘处理回调方法

      glutDisplayFunc( render );

      ...

    }

  • 相关阅读:
    3月30日
    3月29日
    3月26日
    3月24
    3月22日
    3月20日
    博弈论基础
    $burnside$引理与$pacute olya$定理
    min-max容斥
    模板
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/7873667.html
Copyright © 2011-2022 走看看