文章目录

  • 1.Opengl的Hello world
  • 2.初始化(调整试图)
  • 3.增加Reshape函数
  • 3.事件
  • 4.动画

1.Opengl的Hello world

最基础的程序,画了个三角形,请确保理解这个程序,核心是opengl是一个状态机。想象opengl是一个几何画板,glBegin(GL_TRIANGLES);就是点击绘制三角。glColor3f(1.0, 0.0, 0.0);就是将颜色设置为红色。然后你在三个不同位置点了三个点。glFlush();就是保存提交给画面。然后你就得到了结果。

#include <gl/glut.h>
//当窗口发生变化(如改变大小)时自动调用
void mydisplay()
{//清除颜色缓存glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);//二维也可以用glVertex2f//第一点红色glColor3f(1.0, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);//第二点绿色glColor3f(0.0, 1.0, 0.0);glVertex3f(0.0, 1.0, 0.0);//第三点蓝色glColor3f(0.0, 0.0, 1.0);glVertex3f(0.0, 0.0, 0.0);glEnd();glFlush();
}int main(int argc, char** argv)
{glutInit(&argc, argv);//初始化窗口名称glutCreateWindow("A Triangle");//绑定display函数glutDisplayFunc(mydisplay);//开启窗口循环glutMainLoop();return 0;
}

2.初始化(调整试图)

手动设置了使用RGB绘制、窗口位置及窗口大小。并且在init函数中加入了glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);将图像变成了图中(x,y,z)分别对应范围(0-1,0-1,0-1)区间。

#include <gl/glut.h>
//当窗口发生变化(如改变大小)时自动调用
void mydisplay()
{//清除颜色缓存glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);//二维也可以用glVertex2f//第一点红色glColor3f(1.0, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);//第二点绿色glColor3f(0.0, 1.0, 0.0);glVertex3f(0.0, 1.0, 0.0);//第三点蓝色glColor3f(0.0, 0.0, 1.0);glVertex3f(0.0, 0.0, 0.0);glEnd();glFlush();
}void init()
{//全屏颜色变成黑色glClearColor(0.0, 0.0, 0.0, 1.0);//改变投影视图,glMatrixMode(GL_PROJECTION);//opengl是一个状态机,要先清空之前的变换矩阵数据,所以每次视角操作时都要先变为单位矩阵glLoadIdentity();glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
}int main(int argc, char** argv)
{glutInit(&argc, argv);//GLUT_RGB指使用RGB进行绘制glutInitDisplayMode(GLUT_RGB);//初始化窗口大小glutInitWindowSize(100, 100);//初始化窗口位置glutInitWindowPosition(100, 100);//设置窗口名glutCreateWindow("A Triangle");//绑定display函数glutDisplayFunc(mydisplay);//设定opengl初始状态init();//开启窗口循环glutMainLoop();return 0;
}

3.增加Reshape函数

在改变窗口时会调用的函数。默认的reshape函数会直接拉伸图形。

我们希望图像不被拉伸,而是保持原有大小。

#include <gl/glut.h>//窗口初始大小
int initW = 300;
int initH = 300;//当窗口发生变化(如改变大小)时自动调用
void mydisplay()
{//清除颜色缓存glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);//二维也可以用glVertex2f//第一点红色glColor3f(1.0, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);//第二点绿色glColor3f(0.0, 1.0, 0.0);glVertex3f(0.0, 1.0, 0.0);//第三点蓝色glColor3f(0.0, 0.0, 1.0);glVertex3f(0.0, 0.0, 0.0);glEnd();glFlush();
}//初始化函数,一般包括视角等
void init()
{//全屏颜色变成黑色glClearColor(0.0, 0.0, 0.0, 1.0);//改变投影视图,glMatrixMode(GL_PROJECTION);//opengl是一个状态机,要先清空之前的变换矩阵数据glLoadIdentity();glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
}//当改变窗口大小时调用的数据
void myReshape(int w, int h)
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(0, 1.0, 0.0, (GLfloat)h / (GLfloat)w * 1.0, 0.0, 1.0);elseglOrtho(0, (GLfloat)w / (GLfloat)h * 1.0, 0.0, 1.0, 0.0, 1.0);
}int main(int argc, char** argv)
{glutInit(&argc, argv);//GLUT_RGB指使用RGB进行绘制glutInitDisplayMode( GLUT_RGB);//初始化窗口大小glutInitWindowSize(initW, initH);//初始化窗口位置glutInitWindowPosition(100, 100);//设置窗口名glutCreateWindow("A Triangle");//绑定display函数glutDisplayFunc(mydisplay);//设定opengl初始状态init();//绑定改变窗口大小时调用的函数glutReshapeFunc(myReshape);//开启窗口循环glutMainLoop();return 0;
}

3.事件

增加了鼠标左键点击事件mouse,点击时会改变图像亮度并输出点击位置

#include <gl/glut.h>
#include <iostream>//窗口初始大小
int initW = 300;
int initH = 300;//颜色亮度
GLfloat brightness = 1.0;
GLfloat increment = -0.1;//当窗口发生变化(如改变大小)时自动调用
void mydisplay()
{//清除颜色缓存glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);//二维也可以用glVertex2f//第一点红色glColor3f(brightness, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);//第二点绿色glColor3f(0.0, brightness, 0.0);glVertex3f(0.0, 1.0, 0.0);//第三点蓝色glColor3f(0.0, 0.0, brightness);glVertex3f(0.0, 0.0, 0.0);glEnd();glFlush();
}//初始化函数,一般包括视角等
void init()
{//全屏颜色变成黑色glClearColor(0.0, 0.0, 0.0, 1.0);//改变投影视图,glMatrixMode(GL_PROJECTION);//opengl是一个状态机,要先清空之前的变换矩阵数据glLoadIdentity();glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
}//当改变窗口大小时调用的数据
void myReshape(int w, int h)
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(0, 1.0, 0.0, (GLfloat)h / (GLfloat)w * 1.0, 0.0, 1.0);elseglOrtho(0, (GLfloat)w / (GLfloat)h * 1.0, 0.0, 1.0, 0.0, 1.0);
}//鼠标事件
void mouse(int btn, int state, int x, int y)
{//左击鼠标,调整图像亮度if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN){//输出位置,注意鼠标原点在左上角,图像原点在右下角,所以y是反的std::cout << "x: " << x << " y: " << y << std::endl;//改变亮度brightness += increment;if (brightness >= 1.0 || brightness <= 0.0)increment = -increment;}
}int main(int argc, char** argv)
{glutInit(&argc, argv);//GLUT_RGB指使用RGB进行绘制glutInitDisplayMode( GLUT_RGB);//初始化窗口大小glutInitWindowSize(initW, initH);//初始化窗口位置glutInitWindowPosition(100, 100);//设置窗口名glutCreateWindow("A Triangle");//绑定display函数glutDisplayFunc(mydisplay);//设定opengl初始状态init();//绑定改变窗口大小时调用的函数glutReshapeFunc(myReshape);//绑定鼠标事件glutMouseFunc(mouse);//开启窗口循环glutMainLoop();return 0;
}

4.动画

使用定时器的一段动画,图像亮度随时间变化

#include <gl/glut.h>
#include <iostream>//窗口初始大小
int initW = 300;
int initH = 300;//颜色亮度
GLfloat brightness = 1.0;
GLfloat increment = -0.1;//当窗口发生变化(如改变大小)时自动调用
void mydisplay()
{//清除颜色缓存glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_TRIANGLES);//二维也可以用glVertex2f//第一点红色glColor3f(brightness, 0.0, 0.0);glVertex3f(1.0, 0.0, 0.0);//第二点绿色glColor3f(0.0, brightness, 0.0);glVertex3f(0.0, 1.0, 0.0);//第三点蓝色glColor3f(0.0, 0.0, brightness);glVertex3f(0.0, 0.0, 0.0);glEnd();//使用DOUBLE_BUFFER后,使用以下代码来交换前后台内存glutSwapBuffers();
}//定时器调用的函数
void changeColor(int x)
{//改变亮度brightness += increment;if (brightness >= 1.0 || brightness <= 0.0)increment = -increment;//立刻重新调用display函数,不然图像不会被立刻绘制glutPostRedisplay();//设置新的定时器glutTimerFunc(100, changeColor, 0);
}//初始化函数,一般包括视角等
void init()
{//全屏颜色变成黑色glClearColor(0.0, 0.0, 0.0, 1.0);//改变投影视图,glMatrixMode(GL_PROJECTION);//opengl是一个状态机,要先清空之前的变换矩阵数据glLoadIdentity();glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
}int main(int argc, char** argv)
{glutInit(&argc, argv);//GLUT_DOUBLE双缓存,通常应用于动画中,可以使动画更顺滑//GLUT_RGB指使用RGB进行绘制glutInitDisplayMode( GLUT_RGB|GLUT_DOUBLE);//初始化窗口大小glutInitWindowSize(initW, initH);//初始化窗口位置glutInitWindowPosition(100, 100);//设置窗口名glutCreateWindow("A Triangle");//设置定时函数glutTimerFunc(10, changeColor, 0);//绑定display函数glutDisplayFunc(mydisplay);//设定opengl初始状态init();//开启窗口循环glutMainLoop();return 0;
}

OPENGL学习(三)GLUT二维图像绘制相关推荐

  1. 对P5基本二维图像绘制库的交互性扩展

    5379@TOC 对P5基本二维图像绘制库的交互性扩展 因为课程需要接触学习了P5.js ,觉得还蛮有意思的 下面是对它的2D绘图函数的一些简单扩展. ///终于等到你/ 无非是用周期性.随机性.对称 ...

  2. Matlab数据可视化方法与模板(2)——二维图像绘制

    当下越来越多研究人员选择运用Matlab对数据进行建模处理,并进行相应的数据可视化操作.本系列对Matlab绘图与可视化方法进行了总结,并给出了相应的模板供各位参考使用,希望对各位的研究与工作有所帮助

  3. OpenCV C++案例实战三《二维码检测》

    OpenCV C++案例实战三<二维码检测> 前言 一.二维码检测 二.二维码识别 1.通过findContours找到轮廓层级关系 三.二维码绘制 四.源码 总结 前言 本文将使用Ope ...

  4. python画车辆轨迹图_如何利用 Python 绘制酷炫的 车辆轨迹 — 速度时空图?三维数据用二维图像呈现...

    说明:本文系交通攻城狮原创文章,如需转载请私信联系,侵权必究. 2020,第 30 期,编程笔记 建议直接阅读精编版:如何利用 Python 绘制酷炫的 车辆轨迹 - 速度时空图?三维数据用二维图像呈 ...

  5. python怎么画简单图片-Python绘制简易的二维图像

    大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...

  6. python绘制曲线y=2x+5_Python绘制简易的二维图像

    大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...

  7. 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图

    [Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...

  8. 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )

    文章目录 一.绘制二维图像 1.二维绘图步骤 2.二维绘图步修饰 3.代码示例 二.设置图像参数 1.图像参数 2.代码示例 一.绘制二维图像 1.二维绘图步骤 绘图前需要给定 xxx 轴 , yyy ...

  9. MATLAB学习——图形绘制(2):二维图形绘制plot指令

    摘要 二维图形是MATLAB图形的基础,也是应用最广泛的图形类型之MATLAB提供了许多二维图形绘制函数. MATLAB基本的二维图形包括线型(LinePlots) .散点型(ScatterPlots ...

最新文章

  1. A query was run and no Result Maps were found
  2. map的生命周期 java,【JAVA面试的艺术】JAVA基础知识阶段三
  3. 前端模板Nunjucks简介
  4. DeDeCMS后台批量修改替换sql语句大全
  5. java 流式_Java开发笔记(七十二)Java8新增的流式处理
  6. Altium Designer20新建项目\导入库\绘制原理图\导入pcb\绘制pcb
  7. 补习系列(22)-全面解读 Spring Profile 的用法
  8. 微博正式登陆港交所挂牌上市:开盘破发 较发行价跌6.1%
  9. 王思聪在京被执行案和解了!已履行5000万
  10. 【flink】95-260-045-源码-检查点-CheckPoint
  11. Atiitt 自我学习法流程 1.预先阶段 1.1.目标搜索 资料搜索 1.2. 1.3.通过关联关键词 抽象 等领域 拓展拓宽体系树 1.4. 2.分析整理阶段 2.1.找出重点 压缩要学会
  12. Gliffy Diagrams(在线绘图)
  13. Codeblocks下载安装使用教程
  14. ubuntu14.04 有道辞典 安装成功后 打不开 的 解决办法
  15. datav多组件交互
  16. HDU杭电OJ经典100题2000-2099_Java版详细题解(持续更新)
  17. java实现单一登录 踢人效果
  18. 苏宁门店数字化白皮书发布 行业数字化进程将再提速
  19. 手机开热点显示互联网无服务器,win10热点无互联网连接的具体解决办法【图文】...
  20. 巧用热风枪焊拆各种元器件

热门文章

  1. WiFi开发|ESP8266模组AT指令开发二
  2. Zjh游戏(二十三)自身弃牌、比牌以及加注的处理
  3. matlab/simulink汽车带可变阻尼的半主动悬架系统模型
  4. 【早晚学linux】初学者应选择哪个Linux发行版?
  5. 制作公司的小型oa系统
  6. 技术面试问项目难题如何解决的_技术面试感觉什么都会,面试官一问回答不上来怎么办?...
  7. 【调剂】东南大学无锡校区2020年相关专业调剂信息
  8. 愿你读懂此书,依旧善良。
  9. Excel 2010迷你图,单元格中的图表
  10. Cimage图像拷贝