OpenGL3:幼儿园篇 第一章 使用FreeGlut

一.简介

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.

复制代码
#include <GL/freeglut.h>


//////////////////////////////////////////////////////
// 渲染场景
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;
}

 

posted @   言午丶  阅读(741)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示