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

  ...

}

 

posted @   yongfengnice  阅读(1165)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示