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 ", name);
    printf("渲染器标识符:%s ", biaoshifu);
    printf("OpenGL实现的版本号:%s ", OpenGLVersion);
    printf("OGLU工具库版本:%s ", gluVersion);

    // 处理消息循环
    glutMainLoop();

    //system("pause");
    return 0;
}

2.

鼠标按下矩形旋转

#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();
}

// 窗口宽和高 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; }
原文地址:https://www.cnblogs.com/k5bg/p/11170215.html