【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位置,这些选项就会重新生效。

NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第38课 从… NeHe的OPENGL中文教程:第37课 卡… 愚人节十大IT假新闻:Opera浏览器… NeHe的OPENGL中文教程:第36课 放… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第34课 从… NeHe的OPENGL中文教程:第33课 加… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第31课 模… NEHE的OPENGL中文教程:第30课 碰… NEHE的OPENGL中文教程:第30课 碰… NeHe的OPENGL中文教程:第29课 Bli… NeHe的OPENGL中文教程:第28课 贝… NeHe的OPENGL中文教程:第27课 影… NeHe的OPENGL中文教程:第26课剪裁… NeHe的OPENGL中文教程:第25课 变… NeHe的OPENGL中文教程:第24课 TAG… NeHe的OPENGL中文教程:第23课 球… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第20课 蒙… NeHe的OPENGL中文教程:第19课 粒… NeHe的OPENGL中文教程:第18课 二… NeHe的OPENGL中文教程:第17课 2D… NeHe的OPENGL中文教程:第16课 雾 NeHe的OPENGL中文教程:第15课 图… NeHe的OPENGL中文教程:第14课 图… NeHe的OPENGL中文教程:第13课 位… NeHe的OPENGL中文教程:第12课 显… NeHe的OPENGL中文教程:第11课 飘… NeHe的OPENGL中文教程:第十课 漫… NeHe的OPENGL中文教程:第九课 漂… NeHe的OPENGL中文教程:第八课 Alp… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第六课 纹… NeHe的OPENGL中文教程:第五课 向3… NeHe的OPENGL中文教程:第四课 旋… NeHe的OPENGL中文教程:第三课 着… NeHe的OPENGL中文教程:第二课 多… NeHe的OPENGL中文教程:第课 新… NeHe的OPENGL中文教程:第课 新… DirectX与OpenGL方面的经典电子书… VC++ 6.0下OpengGL配置以及glut配… 怎样开始学习OpenGL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值