【OpenGL】(一)概念以及入门内容

OpenGL是什么:

一般都认为OpenGL是一个API,包括了一系列可以操作图形,图像的函数。然而, OpenGL本身并不是一个API,它仅仅是一个规范。

OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现的,将由OpenGL库的开发者自行决定。

核心模式与立即渲染模式

早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。但,随着时间的推移,规范越来越灵活,立即渲染模式确实容易使用和理解,效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励我们在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。

因此,当使用OpenGL的核心模式时,OpenGL强迫使用现代的函数,当我们使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。现代函数的优势就是更高的灵活性和效率,但是学习起来更难。

注:其实新版本的OpenGL无非是在OpenGL3.3的基础上引入了额外的功能,并没改动核心架构。新版本只是引入了一些更有效率或更有用的方式来完成同样的功能。

扩展

OpenGL的一大特性就是对扩展的支持。当一个显卡公司提出一个新特性或者渲染上的大优化,通常以扩展的方式在驱动中实现。
而使用扩展的代码大多看上去如下:

if(GL_ARB_Extension_name)
{
	//使用硬件支持的全新的现代特性
}
else
{
	//不支持此扩展,用旧的方法做
}

状态机

OpenGL自身是一个巨大的状态机(state machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL的上下文(context)
通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲,最后使用当前OpenGL上下文渲染
假设当我们想告诉OpenGL去画线段而不是三角形的时候,我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。

对象

OpenGL是用C语言写的,由于C的一些语言结构不易被翻译到其他的高级语言,因此OpenGL开发的时候引入了一些抽象层。对象(object)就是其中一个。
在OpenGL中,一个对象就是指一些选项的集合,代表OpenGL状态的一个子集。可以把对象看成一个C风格的结构体(struct):

struct object_name{
	float option1;
	int option2;
	char[] name;
};

当我们使用一个对象时,通常看起来像如下一样:

//OpenGL的状态
struct OpenGL_Context
{
	...
	object *object Window_Target;
	...
};
//创建对象
unsigned int objectId = 0 ;
glGenObject(1,&objectId);
//绑定对象至上下文
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、创建一个对象,用一个id保存它的引用(实际数据被储存在后台)
  • 2、将对象绑定至上下文的目标位置(例如上述代码中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。
  • 3、设置窗口的选项
  • 4、将目标位置的对象id设回0,解绑这个对象。

设置的选项将被保存在objectId所引用的对象中,一旦重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。

你可能感兴趣的:(OpenGL,c++,图形渲染,c语言,开发语言)