首页 > 编程语言 >OpenGL(2) ->第一个程序

OpenGL(2) ->第一个程序

时间:2022-11-22 10:35:52浏览次数:38  
标签:窗口 第一个 OpenGL int void 程序 GLfloat 函数


文章目录

  • ​​一、先看几个定义​​
  • ​​二、第一个程序​​
  • ​​1、代码​​
  • ​​2、简单解析​​
  • ​​1、main函数​​
  • ​​(1)int main(int argc, char *argv[])​​
  • ​​(2)void glutInit(int *argcp, char **argv)​​
  • ​​(3)void glutInitDisplayMode(unsigned int mode);​​
  • ​​(4)void glutInitWindowPosition(int x, int y);​​
  • ​​(5)void glutInitWindowSize(int width, int height);​​
  • ​​(6)int glutCreateWindow(const char *title);​​
  • ​​(7)void glutDisplayFunc(void (*func)(void));​​
  • ​​(8)void glutMainLoop(void);​​
  • ​​2、显示回调函数void myDisplay()​​
  • ​​(1) void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);​​
  • ​​(2)void glClear (GLbitfield mask)​​
  • ​​(3)void glColor3f (GLfloat red, GLfloat green, GLfloat blue);​​
  • ​​(4)void glBegin (GLenum mode) & void glEnd (void)​​
  • ​​(5)void glVertex2f (GLfloat x, GLfloat y);​​
  • ​​(6)glFlush()​​
  • ​​三、简单的程序框架​​

一、先看几个定义

  • ​渲染 (rendering)​​:计算机根据模型创建物体的过程
  • ​模型(model)​​​/​​物体(object)​​:根据几何图元(点、直线、多边形等)创建的图案
  • ​顶点(vertex)​​:用于指定图元的点
  • ​位平面(bitplane)​​:一块内存区域,保存了屏幕上每个像素一个位的信息(例如它可以提示一个特定像素颜色中红色的强度)
  • ​帧缓冲区(framebuffer)​​:由位平面构成,保存了屏幕上所有像素的颜色&强度所需的全部信息

二、第一个程序

如下代码可以看作一个简单窗口程序的样板,它的功能是在蓝色背景上显示一个红色矩形边框

1、代码

#include <GL/glut.h>
//显示回调函数
void myDisplay()
{
glClearColor(0.0, 0.0, 1.0, 0.0); //设置颜色缓冲为蓝色
glClear(GL_COLOR_BUFFER_BIT); //根据颜色缓冲给整个窗口涂色
glColor3f(1.0, 0.0, 0.0); //绘制颜色Red

glBegin(GL_LINE_LOOP); //开始绘图(封闭线段模式)
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glVertex2f(-0.5, -0.5);
glEnd(); //结束绘图
glFlush(); //立即显示
}


int main(int argc, char *argv[])
{
glutInit(&argc, argv); //对GLUT进行初始化
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //显示方式为 单缓冲 RGB色彩
glutInitWindowPosition(100, 100); //窗口(左上角)位置
glutInitWindowSize(400, 400); //窗口尺寸(单位为像素)
glutCreateWindow("第一个OpenGL程序"); //窗口标题
glutDisplayFunc(&myDisplay); //显示回调函数
glutMainLoop();
return 0;
}

OpenGL(2) ->第一个程序_初始化

2、简单解析

1、main函数

(1)int main(int argc, char *argv[])
  • 这是带两个参数的main函数形式,关于这两个参数可以参考文章:​​参考1,​​​​ 参考2​​
(2)void glutInit(int *argcp, char **argv)
  • 对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句glutInit(&argc, argv)就可以了。
(3)void glutInitDisplayMode(unsigned int mode);
  • 设置显示方式,可以用​​|​​连接多个参数
  • ​GLUT_RGB​​​表示使用RGB颜色,​​GLUT_INDEX​​表示使用索引颜色。
  • ​GLUT_SINGLE​​​表示使用单缓冲,​​GLUT_DOUBLE​​表示使用双缓冲。
(4)void glutInitWindowPosition(int x, int y);
  • 设置窗口(左上角)在屏幕中的位置
  • 单位为像素
  • 坐标(0,0)表示屏幕左上角。
  • 屏幕右下角位置为显示器设置的分辨率,如(1920,1080)
(5)void glutInitWindowSize(int width, int height);
  • 设置窗口的大小
  • 单位为像素,(width,height)

(6)int glutCreateWindow(const char *title);

  • 根据前面设置的信息创建窗口,参数将被作为窗口的标题。
  • 注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。

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

  • 显示回调函数,这个函数告诉 GLUT :当窗口内容必须被绘制时,myDisplay函数将被自动调用
  • 调用的时机有这么几个:
  1. 窗口内容绘制
  2. 窗口大小改变
  3. 窗口重绘

(8)void glutMainLoop(void);

  • 让 glut 程序进入事件循环。
  • 进入事件循环后,程序会循环检查事件队列,若有等待处理的信息,程序将调用设定的回调函数(比如上面那个)处理这些事件。同时,窗口大小改变、键鼠输入等事件会实时加入消息队列,
  • 在一个 glut 程序中最多只能调用一次,且必须调用。
  • 事件循环是一个死循环,一旦调用,会直到程序结束才返回。

OpenGL(2) ->第一个程序_初始化_02

2、显示回调函数void myDisplay()

(1) void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);

  • 这句是指对颜色缓冲区赋值,参数为(R,G,B,alpha),也就是RGBA颜色值
  • GLclampf 是OpenGL的数据类型,这是一个32位的浮点数。当OpenGL使用这个类型时,数据取值范围在0.0~1.0
  • 需要和下一句配合使用每当执行到glClear(GL_COLOR_BUFFER_BIT)指令时,程序会从此缓冲区读取颜色并对整个窗口上色

(2)void glClear (GLbitfield mask)

  • 参数为GL_COLOR_BUFFER_BIT时,这句是对窗口进行涂色,颜色来自glClearColor函数的设置,缺省为黑色
  • 需要和上一句配合使用,若要涂色,必须在这句之前调用glClearColor设置所需的颜色
  • 此函数可以清除的缓冲区包括以下几个,都是需要配合各缓冲的设置缓冲区函数使用
  • OpenGL(2) ->第一个程序_回调函数_03


(3)void glColor3f (GLfloat red, GLfloat green, GLfloat blue);

  • 指定绘制颜色
  • 参数为(R,G,B),也就是RGB颜色值,取值在0.0~1.0
  • 制定后会一直使用此颜色绘制,除非重新调用此函数修改颜色

(4)void glBegin (GLenum mode) & void glEnd (void)

  • 这两个总是成对出现
  • glBegin标记几何要素定义开始,glEnd表示几何要素定义结束
  • 绘图时我们需要指定关键顶点(glVertex2f函数),指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。并由glBegin的参数来指明如何使用这些点,有以下选择
  • 我们选择了GL_LINE_LOOP,所以四个关键点最后被连接为矩形框
  • OpenGL(2) ->第一个程序_回调函数_04


(5)void glVertex2f (GLfloat x, GLfloat y);

  • 这表示定义一个二维向量。
  • 此类函数在OpenGL中有多个版本,对应的传入参数不同,方便使用。
  • 在​​glBegin()​​ & ​​glEnd()​​之间,这表示在裁剪区域中定义了一个关键点坐标
  • 这里关键点坐标的具体选取,涉及到窗口、视口、剪裁区等的映射关系,这些将在下一篇文章分析。

(6)glFlush()

  • 强制绘图命令立刻开始执行,而不是存储在缓冲区中等待其他OpenGL命令
三、简单的程序框架

我们可以把上面这个示例当作一个程序框架记住

#include <GL/glut.h>

//显示回调函数
void Display()
{
.....
}

//初始化设置
void init()
{
......
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(...);
glutInitWindowPosition(...);
glutInitWindowSize(...);
glutCreateWindow(...);
init();
glutDisplayFunc(&Display);
glutMainLoop();
return 0;
}

它的执行顺序如下:

OpenGL(2) ->第一个程序_事件循环_05




标签:窗口,第一个,OpenGL,int,void,程序,GLfloat,函数
From: https://blog.51cto.com/u_15887260/5876708

相关文章

  • OpenGL(1) ->概念&介绍
    文章目录​​一、计算机图形系统​​​​二、相关概念​​​​1、分辨率​​​​2、屏幕坐标系​​​​三、OpenGL图形软件包​​​​1、简介​​​​2、四种变换​​​​......
  • 项目demo —— PyQt5简单画板程序
    文章目录​​前情提要​​​​demo演示​​​​代码​​​​1.Node节点类​​​​2.Canvas画布类​​​​3.Editor编辑器类​​前情提要最近在看强化学习,想着快速做一......
  • 如何成为一名成功的自由程序员?
    英文| ​​https://medium.com/swlh/how-to-be-a-successful-freelance-programmer-91f58cd4de43​​翻译|web前端开发让我们面对现实吧,成为一名自由程序员有一些主要的......
  • 小程序Day01
    注册一个微信小程序账号测试号不能用云开发 构建npm(下载node.js)npmi@vant/weapp-S--productionifwrongnpminit//npmintall--productionnpmivant-wepp......
  • python flask实战订餐系统微信小程序-59flask部署单进程启动服务
    欢迎关注原创Python微信订餐小程序课程视频Python实战量化交易理财系统​​python​​​​flask​​实战订餐系统微信小程序-60nginx+uwsgi实现多进程访问​​​B站配套......
  • 使用C#简单制作一个看门狗程序
    摘要在有些特殊项目中,软件可能是无人值守的,如果程序莫名其妙挂了或者进程被干掉了等等,这事开发一个看门狗程序是非常有必要的,它就像一只打不死的小强,只要程序非正常退出,它......
  • #yyds干货盘点#【愚公系列】2022年11月 微信小程序-地图的使用之线聚合
    前言地图基础属性:属性类型默认值必填说明最低版本longitudenumber是中心经度1.0.0latitudenumber是中心纬度1.0.0scalenumber16否缩放......
  • 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序
    1、需要在服务器安装AccessDatabaseEngine_2010_X64.exe驱动程序2、虽然金蝶安装程序目录是32位的,但是IIS的w3wp进程是64位,所以安装64位的AccessDatabaseEngine才有用3......
  • 副业是刚需?分享几个程序员接外包私活的网站
     经常看到某某程序员接了个项目开发,工作之余轻轻松松赚了钱还顺带提升了技术;或者看到某大佬又发表了一篇程序员技术提升稿件,阅读点赞收藏三连发,这个月的零花钱又不愁了.......
  • 应该选择网络安全还是程序员?
    很长的时间我都在思考这个问题.,根据自己的经验和朋友们的讨论后得出了一些结论,网络安全这个概念太广,我就以安服/渗透岗作为比较的对象,题主可以参考一下:程序员:优点:1.薪......