title: OpenGL(1)初探
date: 2020-06-28 7:30
category: 图形学
tags: opengl
OpenGL(1)初探
1.OpenGL是什么?
一般它被认为是一个API(Application Programming Interface,应用程序编程接口),包含了一系列可以操作图形,图像的函数,但是可惜的是OpenGL本身并不是一个API,它是一个由Khronos组织制定并维护的规范。
规定了每个函数该如何执行,以及它们的输出值,至于内部具体每个函数是如何实现的,将由OpenGL库的开发者(显卡的生厂商)自行决定
2.核心模式与立即渲染模式介绍
立即渲染模式(Immediate mode,固定渲染管线)是一种早期的OpenGL渲染模式,
优点:绘制图形方便.
缺点:大多数功能被库隐藏起来,灵活性不高,效率低下。
从OpenGL3.2开始,规范文档开始废弃了立即渲染模式。
核心模式(Core-profile):使用现代函数,具有更高的灵活性和效率,但是更难于学习。
3.扩展什么?
OpenGL的一大特性就是对扩展(Extension)的支持,场景如下:
当显卡公司提出一个新特性或渲染上的大优化,通常以扩展的方式在驱动中实现,因此开发者不需要等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性。
//伪代码如下:
if (GL_ARB_extension_name)
{
//使用硬件支持的全新的现代特性
}else{
//不支持此扩展:用旧的方式去做
}
4.状态机的概念
OpenGL自身是一个巨大的状态机(State Machine): 拥有一系列的变量(state)描述OpenGL此刻应当如何运行,那么OpenGL的状态通常被称为OpenGL上下文。
状态如何设置:设置选项,操作缓冲,最后利用当前状态进行渲染;
具体如下:比如告诉OpenGL去画线段而不是三角形的时候,通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘制图,
比如改变OpenGL的状态为绘制线段,那么下一个绘制命令就是画出线段而不是三角形。
5.OpenGL中的对象
OpenGL中的对象指的一些选项的集合,即OpenGL状态的子集。
具体解释:使用一个对象来代表绘制窗口的设置(其实就是一个设置窗口的选项,上述的概念就对应起来了),对象肯定有属性,那么后续设置窗口的大小,支持的颜色位数等等信息
编程风格:C风格的结构体
struct object_name{
float option1;
int option2;
char[] name;
}
实例演示:
// OpenGl的状态
struct OpenGL_Context{
//....
object* object_window_Taret;
//....
}
//创建对象
unsigned int objectId =0;
glGenObject(1,&objectId);
//绑定对象上下文(状态,创建一个window)
glBindObject(GL_WINDOW_TARGET,objectId);
//设置当前绑定的GL_WINDOW_TARGET的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET,GL_OPTION_WINDOW_WIDTH,800);
glSetObjectOption(GL_WINDOW_TARGET,GL_OPTION_WINDOW_HEIGHT,600);
//将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET,0);// 好比资源的回收的意思
总结:上述代码展现了使用OpenGL时常见的工作流;
-
1.创建一个对象
-
2.然后用一个id保存它的引用(实际数据存储在后台)
-
3.将对象绑定在上下文的目标位置
-
4.设置上下文的选项
-
5.最后将目标上下文的对象id设置为0,解绑这个对象。
设置的选项将被保存在objectId所引用的对象中,一旦重新绑定这个对象到目标上下文,这些选项会重新生效,这样就不用重复去设置选项了