OPENGL学习(三)GLUT二维图像绘制
文章目录
- 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二维图像绘制相关推荐
- 对P5基本二维图像绘制库的交互性扩展
5379@TOC 对P5基本二维图像绘制库的交互性扩展 因为课程需要接触学习了P5.js ,觉得还蛮有意思的 下面是对它的2D绘图函数的一些简单扩展. ///终于等到你/ 无非是用周期性.随机性.对称 ...
- Matlab数据可视化方法与模板(2)——二维图像绘制
当下越来越多研究人员选择运用Matlab对数据进行建模处理,并进行相应的数据可视化操作.本系列对Matlab绘图与可视化方法进行了总结,并给出了相应的模板供各位参考使用,希望对各位的研究与工作有所帮助
- OpenCV C++案例实战三《二维码检测》
OpenCV C++案例实战三<二维码检测> 前言 一.二维码检测 二.二维码识别 1.通过findContours找到轮廓层级关系 三.二维码绘制 四.源码 总结 前言 本文将使用Ope ...
- python画车辆轨迹图_如何利用 Python 绘制酷炫的 车辆轨迹 — 速度时空图?三维数据用二维图像呈现...
说明:本文系交通攻城狮原创文章,如需转载请私信联系,侵权必究. 2020,第 30 期,编程笔记 建议直接阅读精编版:如何利用 Python 绘制酷炫的 车辆轨迹 - 速度时空图?三维数据用二维图像呈 ...
- python怎么画简单图片-Python绘制简易的二维图像
大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...
- python绘制曲线y=2x+5_Python绘制简易的二维图像
大家好,我是飞向天空的牛. 最近学习了一下用Python绘制简易的二维图像,代码如下图所示:绘图代码 文本如下: import matplotlib.pyplot as plt import nump ...
- 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图
[Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...
- 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )
文章目录 一.绘制二维图像 1.二维绘图步骤 2.二维绘图步修饰 3.代码示例 二.设置图像参数 1.图像参数 2.代码示例 一.绘制二维图像 1.二维绘图步骤 绘图前需要给定 xxx 轴 , yyy ...
- MATLAB学习——图形绘制(2):二维图形绘制plot指令
摘要 二维图形是MATLAB图形的基础,也是应用最广泛的图形类型之MATLAB提供了许多二维图形绘制函数. MATLAB基本的二维图形包括线型(LinePlots) .散点型(ScatterPlots ...
最新文章
- A query was run and no Result Maps were found
- map的生命周期 java,【JAVA面试的艺术】JAVA基础知识阶段三
- 前端模板Nunjucks简介
- DeDeCMS后台批量修改替换sql语句大全
- java 流式_Java开发笔记(七十二)Java8新增的流式处理
- Altium Designer20新建项目\导入库\绘制原理图\导入pcb\绘制pcb
- 补习系列(22)-全面解读 Spring Profile 的用法
- 微博正式登陆港交所挂牌上市:开盘破发 较发行价跌6.1%
- 王思聪在京被执行案和解了!已履行5000万
- 【flink】95-260-045-源码-检查点-CheckPoint
- Atiitt 自我学习法流程 1.预先阶段 1.1.目标搜索 资料搜索 1.2. 1.3.通过关联关键词 抽象 等领域 拓展拓宽体系树 1.4. 2.分析整理阶段 2.1.找出重点 压缩要学会
- Gliffy Diagrams(在线绘图)
- Codeblocks下载安装使用教程
- ubuntu14.04 有道辞典 安装成功后 打不开 的 解决办法
- datav多组件交互
- HDU杭电OJ经典100题2000-2099_Java版详细题解(持续更新)
- java实现单一登录 踢人效果
- 苏宁门店数字化白皮书发布 行业数字化进程将再提速
- 手机开热点显示互联网无服务器,win10热点无互联网连接的具体解决办法【图文】...
- 巧用热风枪焊拆各种元器件