OpenGL之旅(1):初探

title: OpenGL(1)初探
date: 2020-06-28 7:30
category: 图形学
tags: opengl
https://hashwaney.github.io/

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所引用的对象中,一旦重新绑定这个对象到目标上下文,这些选项会重新生效,这样就不用重复去设置选项了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章