一、什么是OpenGL?
1、Open Graphics Library,它是一个由Khronos组织制定并维护的规范(Specification,理解为文档,规定每个函数功能、in和out,但函数内部如何实现由显卡厂商(OpenGL库开发者)决定)。
2、对程序员来说,OpenGL核心是一个C库,同时也支持多种语言的派生。(当然每种库实现不同)
3、对程序员来说,OpenGL是一套API,包含了一系列可以操作图形、图像的函数。
[一般购买的显卡所支持的OpenGL版本都是为这个系列的显卡专门开发,若OpenGL库表现的行为和规范不一致时,基本都是库开发者留下的bug,通常可以通过升级显卡驱动来解决,这些驱动会包括你的显卡能支持的最新版本的OepnGL。]
二、核心模式(Core-Profile)
1、现代模式,可编程管线。
2、指OpenGL3.2以后版本,使用现代函数,若使用已废弃的函数会抛错。
3、提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程,当然也很难学习。
三、GPU渲染流程是一个流水线。
1、顶点着色器(Vertex Shader) ---> 形状(图元)装配(Shape Assembly) ---> 几何着色器(Geometry Shader) ---> 光栅化(Rasterization) ---> 片段着色器(Fragment Shader) ---> 测试与混合(Test and Blending)
2、3.2版本以前,是固定渲染管线,每个阶段都是固定的。
3、3.2版本以后,是可编程管线,顶点着色器、几何着色器、片段着色器是可编程的。
4、几何着色器可以不管它,但是顶点着色器和片段着色器是必须要写Shader代码提供的。
四、立即渲染模式(Immediate mode)
1、早期的OpenGL使用的模式,传统模式,固定渲染管线。
2、OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算。
3、容易使用和理解,但是效率太低。
4、开发者迫切希望对绘图细节有更多的掌控,因此从OpenGL3.2开始,推出核心模式。
五、状态机(State Machine)
1、OpenGL自身是一个巨大的状态机,状态机是描述OpenGL应当如何运行的所有变量的大集合。
2、As long as you keep in mind that OpenGL is basically one large state machine,most of its functionality will make more sense.
3、OpenGL的状态通常被称为OpenGL上下文(Context),使用当前OpenGL上下文来渲染。
4、OpenGL的函数分为状态设置函数(State-changing Function,改变上下文)和状态使用函数(State-using Function,根据OpenGL状态执行一些操作)。
5、我们通过改变一些上下文变量来改变OpenGL状态(常用途径有设置选项、操作缓冲),从而告诉OpenGL如何去绘图。
6、数据输入---->当前绘制状态(材质、光照效果、如何解读点数据、...)---->图像输出。
六、OpenGL版本说明
1、OpenGL更高的版本,都是在OpenGL3.3的基础上,引入额外的功能,并没有改动核心架构。
2、新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。
3、所有的概念在现代OpenGL版本里都保持一致。
4、当使用新版本的OpenGL特性时,只有新一代的显卡能够支持,这也是为什么大多数开发者基于较低版本的OpenGL编写程序。
七、扩展(Extension)
1、OpenGL对扩展支持,若一个显卡公司提出一个新特性或渲染上的大优化,通常会以扩展的方式在驱动中实现。
2、开发者不必等待一个新的OpenGL规范面世,就可以在支持这个扩展的显卡上运行程序。
3、通常当一个扩展非常流行时,最终将成为未来OpenGL规范的一部分。
4、开发者使用扩展,需要简单检查一下显卡是否支持此扩展。
if(GL_ARB_extension_name)
{
//使用硬件支持的全新的现代特性。
}
else
{
//不支持此扩展,用旧的方式做。
}