OpenGL3:幼儿园篇 第一章 使用FreeGlut
一.简介
FreeGlut是Glut的开源版本
二.配置FreeGlut
1.使用cmake
cmake(cross platform make)是一个跨平台的安装(编译)工具
三.初始化
1.窗口管理函数
glutInit(int* argc, char** argv) // 窗口初始化
glutInitDisplayMode(unsigned int mode) // 窗口属性
glutInitWindowPosition(int x,int y) // 窗口位置
glutInitWindowSize(int width, int size) // 窗口大小
glutInitContextVersion(int majorVersion, int minorVersion) // 窗口版本
glutInitContextFlags(int flags) //
glutCreateWindow(char* string) // 创建窗口
2.事件响应函数
glutIdleFunc(void(*func) (void)) // 空闲回调函数
glutDisplayFunc() // 绘制回调函数
glutReshapeFunc() // 重绘回调函数
glutMouseFunc() // 鼠标回调函数
3.消息循环
glutMainLoop()
4.绘制函数
glutSwapBuffers() // 交换缓存进行重新绘制glutPostRedisplay() // 发送重绘消息
glutGetProcAddress()
四.示例
1.
//////////////////////////////////////////////////////
// 渲染场景
void display(void)
{
glutSwapBuffers(); //双缓存
}
//////////////////////////////////////////////////////
// 重绘窗口
void reshape(int w, int h)
{
}
//////////////////////////////////////////////////////
// 键盘事件
void keyboard(unsigned char key, int x, int y)
{
glutPostRedisplay(); // 发送消息重绘
}
//////////////////////////////////////////////////////
// 主程序入口
int main(int argc, char** argv)
{
// 初始化
glutInit(&argc, argv);
// 显示模式(单缓存 | RGB颜色)
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
// 调整窗口大小和位置
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
// 创建窗口
glutCreateWindow("GLUT");
// 重绘回调函数
glutReshapeFunc(reshape);
// 键盘回调函数
glutKeyboardFunc(keyboard);
// 鼠标回调函数
//glutMotionFunc(mouse);
// 渲染回调函数
glutDisplayFunc(display);
// OpenGL检测
const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
const GLubyte* gluVersion = gluGetString(GLU_VERSION); //返回当前GLU工具库版本
printf("OpenGL实现厂商的名字:%s\n", name);
printf("渲染器标识符:%s\n", biaoshifu);
printf("OpenGL实现的版本号:%s\n", OpenGLVersion);
printf("OGLU工具库版本:%s\n", gluVersion);
// 处理消息循环
glutMainLoop();
//system("pause");
return 0;
}
2.
鼠标按下矩形旋转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <stdio.h> #include <GL/freeglut.h> static GLfloat spin = 0.0; void init( void ) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); } void display( void ) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(spin, 0.0, 0.0, 1.0); glColor3f(1.0, 1.0, 1.0); glRectf(-25.0, -25.0, 25.0, 25.0); glPopMatrix(); glutSwapBuffers(); } void spinDisplay( void ) { spin = spin + 2.0; if (spin > 360.0) spin = spin - 360.0; glutPostRedisplay(); } <br> // 窗口宽和高 void reshape( int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void mouse( int button, int state, int x, int y) { switch (button){ case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(spinDisplay); break ; case GLUT_MIDDLE_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(NULL); break ; default : break ; } } ////////////////////////////////////////////////////// // 主程序入口 int main( int argc, char ** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)