开头

写在开头,推荐看一下这篇文章涨涨知识OpenGL库文件的区别(glut/glew/glfw/glad/freeglut)和环境配置

不知道从哪扒来的glut的参考文档

代码初识

其实之前学的是glfw,上学校的图形学课教的是glut(如果他发了个实验指导手册算教的话…),不过很多东西还是通用的,就目前感觉而言glut上手可能更快…此前学的glad+glfw是LearnOpenGLCN的开源教程,十分推荐。该教程的笔记稍后也会整理公布。

#define GLUT_DISABLE_ATEXIT_HACK
#include <gl/glut.h>int gx = 50;
int gy = 100;void onReshape(int w, int h)
{// 设置视口大小glViewport(0, 0, w, h);// 切换矩阵模式为投影矩阵glMatrixMode(GL_PROJECTION);// 载入单位矩阵glLoadIdentity();// 进行二维平行投影gluOrtho2D(0, w, h, 0);// 切换矩阵模式为模型矩阵glMatrixMode(GL_MODELVIEW);// 发送重绘glutPostRedisplay();
}void onDisplay()
{// 设置清屏颜色glClearColor(1, 1, 1, 0);// 用指定颜色清除帧缓存glClear(GL_COLOR_BUFFER_BIT);static char text[] = "Hello World!";// 定位输出位置glRasterPos2d(gx, gy);// 设置字符串颜色glColor3f(1, 0, 0);for (int i = 0; text[i] != '\0'; i++){// 输出字符glutBitmapCharacter(GLUT_BITMAP_8_BY_13, text[i]);}// 交换双缓存glutSwapBuffers();
}void onMouse(int button, int state, int x, int y)
{if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){gx = x;gy = y;glutPostRedisplay();}
}int main(int argc, char* argv[])
{// 初始化 glutglutInit(&argc, argv);// 设置 OpenGL 显示模式(双缓存, RGB 颜色模式)glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);// 设置窗口初始尺寸glutInitWindowSize(400, 300);// 设置窗口初始位置glutInitWindowPosition(100, 100);// 设置窗口标题glutCreateWindow("Hello");// 设置显示回调函数glutDisplayFunc(onDisplay);// 设置窗口尺寸变化回调函数glutReshapeFunc(onReshape);// 设置鼠标事件回调函数glutMouseFunc(onMouse);// 进入 glut 事件循环glutMainLoop();return 0;
}


效果就是点哪这个文字就移动到哪。

鼠标事件

glutMouseFunc设置当前窗口的鼠标回调。当用户在窗口中按下并释放鼠标按钮时,每次按下和释放都会生成一个鼠标回调。

鼠标事件发生后,会自动调用glut注册好的用来处理它的函数,该函数由glutMouseFunc()注册,根据IDE提示,不难发现被注册的函数应当具有哪些参数,这正好与onMouse(int button, int state, int x, int y)这个函数签名得到了印证。

其中buttion取值可以是左中右键,即:GLUT_LEFT_BUTTONGLUT_MIDDLE_BUTTONGLUT_RIGHT_BUTTON。对于只有两个鼠标按钮的系统,可能无法生成GLUT_MIDDLE_BUTTON回调。

state是鼠标的状态,按下或松开,即:GLUT_DOWNGLUT_UP

xy鼠标当前的窗口坐标(以左上角为原点)

在鼠标回调期间,可能会调用glutGetModifier以确定生成回调的鼠标事件发生时修饰键(modifier keys)的状态。

NULL传递给glutMouseFunc()会禁用鼠标回调的生成。


类似地还有glutEntryFunc()设置当前窗口的鼠标输入/离开回调,其state有两种:GLUT_LEFTGLUT_ENTERED

以及glutMotionFunc()glutPassiveMotionFunc()

当鼠标在窗口内移动,同时按下一个或多个鼠标按钮时调用Motion回调,当鼠标在窗口内移动而不按下鼠标按钮时,将调用PassiveMotion回调。

x 和 y 回调参数指示鼠标在窗口相对坐标中的位置。

类似glutMouseFunc(),将NULL传入会禁用相关回调的生成。


文档中有句话不太明白:If a menu is attached to a button for a window, mouse callbacks will not be generated for that button.

到时候再看看menu是啥

glutMainLoop

glutMainLoop进入GLUT事件处理循环。在GLUT程序中,此例程最多只能调用一次。一旦调用,此例程将永远不会返回。它将根据需要调用已注册的任何回调。

帧缓冲

或许可以看看《图形编程技术学习》(三十八)颜色缓冲

glutBitmapCharacter

void glutBitmapCharacter(void *font, int character);

glutBitmapCharacter使用 OpenGL 呈现位图字符。

font指定要使用的位图字体。

character指定要渲染的字符(不限于 8 位)。

常见的font有:

  • GLUT_BITMAP_8_BY_13:固定宽度的字体,每个字符都适合 8 x 13 像素的矩形。
  • GLUT_BITMAP_9_BY_15
  • GLUT_BITMAP_TIMES_ROMAN_10:10 磅比例间隔的times roman字体。
  • GLUT_BITMAP_TIMES_ROMAN_24
  • GLUT_BITMAP_HELVETICA_10:10 点比例间隔的赫尔维卡字体。
  • GLUT_BITMAP_HELVETICA_12
  • GLUT_BITMAP_HELVETICA_18

渲染不存在的字符不起作用。glutBitmapCharacter会自动设置OpenGL解压缩像素存储模式,并在返回之前保存和恢复以前的模式。生成的对 glBitmap 的调用将根据字符的宽度调整当前栅格位置。

glutPostRedisplay

glutPostRedisplay将当前窗口标记为需要重新显示,通过glutMainLoop()的下一次迭代,

即使有多个glutPostRedisplay(),在下一次回调时也会只生成一个redisplay回调。

关于onReshape

void onReshape(int w, int h)
{// 设置视口大小glViewport(0, 0, w, h);// 切换矩阵模式为投影矩阵glMatrixMode(GL_PROJECTION);// 载入单位矩阵glLoadIdentity();// 进行二维平行投影gluOrtho2D(0, w, h, 0);// 切换矩阵模式为模型矩阵glMatrixMode(GL_MODELVIEW);// 发送重绘glutPostRedisplay();
}

gluOrtho2D定义了一个二维图像投影矩阵。

若不调用gluOrtho2D(),窗口会显示-1<x<1,-1<y<1这个区域。如果调用gluOrtho2D(x1,x2,y,1y2),则窗口会显示x1<x<x2,y1<y<y2这个区域。

在没调用gluOthor2D函数之前,坐标范围是 X:-1~1,Y:-1~1;调用了这个函数之后坐标范围是 X:0~w,Y:0~h

参考

gluOrtho2D作用

gluOrtho2D的作用

OpenGL之glMatrixMode函数的用法

OpenGL之glLoadIdentity函数的用法

模型矩阵、视图矩阵、投影矩阵


这篇文章看着不错

计算机图形学笔记(七)

[OpenGL笔记]glut入门(1)相关推荐

  1. opengl之glut学习笔记(含学习资料来源,对于没头绪,缺少glut资料的有很大帮助)

    目录 单词学习 环境搭建 opengl函数样式 初始化-主函数部分 名词解释 opengl基本图形绘制 点 线 多边形 示例: 窗口改变 动画 键盘控制 场景漫游 学习资料有: 1.Microsoft ...

  2. OpenGL编程轻松入门(一)

    OpenGL编程轻松入门(一) (由同事黄燕创作)   本文介绍了有关OpenGL的基本知识,主要涉及颜色.绘制几何体.坐标变换.堆栈操作.显示列表.光照和材质.纹理映射.特殊效果.曲面和曲线的绘制. ...

  3. 实验一OpenGL图形编程入门

    实验一OpenGL图形编程入门 一. 实验目的 1.了解和掌握OpenGL的安装. 2.掌握一个简单的基于OpenGL的C++程序结构. 3.掌握Win32程序框架. 4.掌握OpenGL中若干基本图 ...

  4. OpenGl计算机图形学入门

    OpenGl计算机图形学入门 前言 一.OpenGl及GLSL 二.语言 1.C++及C++应用程序 (1)C++ (2)C++应用程序 三.库 1.GLFW 窗口管理库 2.GLEW 扩展库 3.G ...

  5. android自定义美颜相机完整程序,Android OpenGL ES从入门到进阶(一)—— 五分钟开发一款美颜相机...

    源码链接:https://github.com/smzhldr/AGLFramework 一.前言 商店里有数十款的美颜相机类产品,其实现原理基本上都是以OpenGL ES为核心的特效处理,大神可以忽 ...

  6. mybatis学习笔记(3)-入门程序一

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(3)-入门程序一 标签: mybatis [TOC] 工程结构 在IDEA中新建了一个普通的java项 ...

  7. opengl编程从入门到精通-hello,window

    窗口 程序中使用的glad.c和glad.h源码: 链接: https://pan.baidu.com/s/1TmtM7O8J4aTnfP6elIgs7g 密码: g5go github源码仓库 op ...

  8. nginx学习笔记-01nginx入门,环境搭建,常见命令

    nginx学习笔记-01nginx入门,环境搭建,常见命令 文章目录 nginx学习笔记-01nginx入门,环境搭建,常见命令 1.nginx的基本概念 2.nginx的安装,常用命令和配置文件 3 ...

  9. React学习笔记:入门案例

    React学习笔记:入门案例 React 起源于 Facebook 内部项目,因为市场上所有 JavaScript MVC 框架都不令人满意,公司就决定自己写一套,用来架设 Instagram 的网站 ...

最新文章

  1. java-多线程 String 常量池缓存功能带来的问题
  2. TensorRT was linked against cuBLAS/cuBLAS LT 11.2.0 but loaded cuBLAS/cuBLAS
  3. python3 通过 pybind11 使用Eigen加速
  4. Web前端技巧分享:教你用GD库生成验证码
  5. mySQL微信小程序的div_做一个微信小程序的完整流程
  6. java遍历文件夹并获取所有路径
  7. php安装dat,PHP Parsing a .dat file
  8. 我的移动混合开发之旅
  9. 高效精准分析定位系统BUG,让你无所不能
  10. 如何在Linux开启HTTP服务,小技巧:如何快速开启一个静态 HTTP 服务?
  11. cx_oracle写日志信息_浅谈微服务架构之构建日志收集系统
  12. 中国金属复合开关设备市场趋势报告、技术动态创新及市场预测
  13. linux重启切换内核,centos7切换启动内核与切换启动模式的讲解
  14. Hyper-V虚拟化测试12非计划的故障转移
  15. cpu vtx测试软件,推荐几个好用的检测电脑CPU是否支持(Virtualization Technology)虚拟化技术的工具-推荐实用小软件 -亦是美网络...
  16. iTunes 12.6.3(含appStore)
  17. java生成pdf表格并插入图片
  18. (拓扑排序+并查集)HDU - 1811 Rank of Tetris
  19. 【华为 OJ 】等差数列
  20. rm -rf 删除文件 恢复

热门文章

  1. jsp: 使用application对象实现网站计数器
  2. 南大通用GBase8s 常用SQL语句(234)
  3. 整理2010年51单片机程序--4*4按键与数码管显示
  4. Linux命令之cat、tac、tail、head命令
  5. 单片机c语言组数怎么用,怎么定义和赋值
  6. 牛刀小试(四)——较完善的购物系统
  7. s.c.普尔著语言学入门,语言学入门
  8. 网页性能优化实战之CPU拉满问题处理
  9. 近期健康类(***)
  10. 当SCM遇见RPA:实现高效协调的供应链管理