Linux OpenGL 实践篇-2 创建一个窗口

OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制。这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们在学习OpenGL时要去学习一整套的窗口系统,这将带来很多的不便,所以出现了GLUT。GLUT全称OpenGL Utility Toolkit,是一套和窗口系统无关的软件包,为我们提供了窗口创建,用户输入输出处理等功能。优点是:简小,精悍。注意GLUT并不是一个功能特别全面的窗口系统工具包,所以构建大型应用的时候还是需要根据需求选择相应的本机窗口系统工具包。

GLUT现有两个发行版:freeglut和原始版本的glut。原始glut的更新并没有随着opengl的发展而保持更新,所以本实践中采用的是freeglut。

GLUT的基本流程包括四步:

1)初始化GLUT库;

2)创建GLUT窗口;

3)注册display()回调函数;

4)进入GLUT主循环;

glut初始化

在使用glut之前,一定要初始化glut库。函数原型为:

void glutInit(int argc,char **argv);

接下来可设置glut的一些属性。

配置显示特性

void glutInitDisplayMode(unsigned int mode);

mode 默认为GLUT_INDEX\GLUT_SINGLE、GLUT_DEPTH的按位组合。

配置OpenGL版本

void glutInitContextVersion(int majorVersion, int minorVersion);

配置创建的上下文信息

void  glutInitContextProfile(int profile)

core版本:GLUT_CORE_PROFILE;

兼容性版本:GLUT_COMPATIBILITY_PROFILE;

创建窗口

int glutCreateWindow(char* name);

设置窗口位置和大小

void glutInitWindowSize(int width,int height);

void glutInitWindowPosition(int x, int y);

设置渲染函数

void glutDisplayFunc(void (*func)(void));

窗口变化回调函数

void glutReshapeFunc(void (*func)(int width, int height));

键盘按键事件监听

void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));

void glutKeyboardUpFunc(void (*func)(unsigned char key, int x, int y));

鼠标事件监听

void glutMouseFunc(void (*func)(int button, int state, int x, int y)); //鼠标被按下是触发

void glutMotionFunc(void (*func)(int x, int y));//按下鼠标按钮并在窗口内移动触发

void glutPassiveMotionFunc(void (*func)(int x, int y));//鼠标指针在窗口内移动

窗口重绘标记

void  glutPostRedisplay(void);标记窗口需要重绘,在下一次的执行过程中,将调用渲染函数。

背景管理

void glutIdleFunc(void (*func)(void));//当没有其它事件需要处理时的时候调用func,典型应用如动画

事件循环

void glutMainLoop();//永远不会返回

原文地址:https://www.cnblogs.com/xin-lover/p/8470380.html

时间: 2024-10-06 13:56:29

Linux OpenGL 实践篇-2 创建一个窗口的相关文章

pywin32创建一个窗口

import win32con,win32gui class MyWindow(): def __init__(self): #注册一个窗口类 wc = win32gui.WNDCLASS() wc.lpszClassName = 'MyWindow' wc.hbrBackground = win32con.COLOR_BTNFACE+1 #这里颜色用法有点特殊,必须+1才能得到正确的颜色 wc.lpfnWndProc = self.wndProc #可以用一个函数,也可以用一个字典 class

MFC创建一个窗口五大步

.窗口的创建步骤: 1.设计一个窗口类: WNDCLASS结构体参数: (1)       UINT style:窗口类的类型, (2)       WNDPROC lpfnWndProc:窗口的过程,接收一个指针,在程序中会将一个回调函数赋给他,有系统自动调用 (3)       int cbClsExtra:追加一定字节的额外存储空间,附加内存空间,常设置为0 (4)       int cbWndExtra:窗口的附加内存,常置为0 (5)       HINSTANCE hInstanc

创建一个窗口

用函数CreateWindow()或CreateWindowEx()来创建窗口(或任何其他类似于窗口的对象,如控件).创建窗口时必须提供窗口类的文本名称,这个窗口类名称为之前想系统申请的类名称,用于表示窗口类.下面是CreateWindowEx()的函数原型: CreateWindowEx( DWORD dwExStyle,//窗口的扩展风格,是一种高级功能,一般都为NULL LPCTSTR lpClassName,//指向注册类名的字符串指针 LPCTSTR lpWindowName,//指向

在linux中用useradd命令创建一个用户后不能登录的解决

在linux学习过程中我用useradd 用户名来创建一个用户后,不能登录,通过网上查询看到这种说法: 一.etc/profile 文件的的权限不足,因为我改过该文件的权限,所以我去试了还是没有用 最后是在学习到谋个地方老师说创建一个新用户后再如果没有指定目录则会在home目录下创建一个与用户名相同的目录, 我用上面的useradd 用户名 命令执行后home命令中没有对应的目录,最后是通过 -m选项完成的, 通过useradd -m 用户名 可以在home目录下找到相应的目录,最后在登录,竟然

Linux OpenGL 实践篇-1

本次实践所使用环境为CentOS 7. 参考:http://www.xuebuyuan.com/1472808.html OpenGL开发环境搭建: 1.opengl库安装 opengl库使用mesa库,安装命令: yum intall mesa* mesa库是一个开源的三维计算机图形库,以开源的形式实现了opengl应用程序接口.具体介绍:https://www.mesa3d.org/intro.html. 2.glut安装 下载freeglut,下载地址为: https://github.c

Linux OpenGL 实践篇-3 framebuffer

GLEW说明 GLEW(OpenGL Extension Wrangler) 是OpenGL的另一个辅助库,主要封装了从OpenGL库中获取函数地址的过程,还包含了一些可以跨平台使用的OpenGL编程方法. 本次实践是使用数据缓存绘制两个三角形,重点是缓存的创建和数据输入.数据输入后,根据数据使用方式可分为非基于索引绘制和基于索引绘制,使用的方法分别为glDrawArray和glDrayElements. 首先,明确OpenGL缓存使用步骤: glGenBuffer glBindBuffer g

Linux OpenGL 实践篇-9 模型

之前一直渲染箱子,显得有点单调.这一次我们绘制一个用艺术家事先用建模工具创建的模型. 本次实践参考:https://learnopengl-cn.github.io/03%20Model%20Loading/01%20Assimp/ 在之前我们的OpenGL实践中,绘制图形的过程是先定义顶点的位置.法线.纹理坐标(UV)等信息,按一定的规则组织后传给着色器处理,最终绘制到屏幕上.现在使用艺术家构建的模型,绘制的过程并没有变,只不过顶点和使用的贴图信息从原来我们自己定义变为从已构建好的模型中提取,

Linux OpenGL 实践篇-12-ProceduralTexturing

程序式纹理 简单的来说程序式纹理就是用数学公式描述物体表面的纹路 .而实现这个过程的着色器我们称之为程序纹理着色器,通常在这类着色器中我们能使用的输入信息也就是顶点坐标和纹理坐标. 程序式纹理的优点 1.程序式纹理的内存占用比预存纹理要低的多:因为程序式纹理主要是算法的实现,数据都是通过计算产生的: 2.程序生成的纹理没有固定的面积和分辨率,可以随意的应用到不同大小的物体,而不用担心精度不够的问题: 3.程序式纹理可以写入一些算法的关键参数,可以方便的供程序修改从而创建出有趣的效果,而预存的纹理

Linux内核是如何创建一个新进程的?

进程描述 进程描述符(task_struct) 用来描述进程的数据结构,可以理解为进程的属性.比如进程的状态.进程的标识(PID)等,都被封装在了进程描述符这个数据结构中,该数据结构被定义为task_struct 进程控制块(PCB) 是操作系统核心中一种数据结构,主要表示进程状态. 进程状态 fork() fork()在父.子进程各返回一次.在父进程中返回子进程的 pid,在子进程中返回0. fork一个子进程的代码 #include <stdio.h> #include <stdli