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 );

  ...

}

原文地址:https://www.cnblogs.com/yongfengnice/p/7873667.html