简介opengl
什么是opengl
OpenGL并不是一个API,而是Khronos组织制定并维护的规范。
规范是指规定了输入和输出的设置,但是不规定函数的实现方法与细节,具体实现由开发者自行决定。(编写OpenGl库的人–OpenGL库的开发者通常是显卡的生产商)
Opengl库表现的行为和规范规定不一致时,基本就是库开发者留下的bug,通过更新驱动可以解决。
驱动(驱动软件程序是安装在操作系统上的软件)也就是硬件厂商根据操作系统编写的配置文件,没有驱动程序,计算机中的硬件就无法工作,不同的操作系统,硬件的驱动程序也不同。
Opengl库与驱动的关系
Opengl通过驱动程序提供的接口和硬件设备进行交流,也就是说,opengl库是对驱动程序的进一步封装。
Opengl的开发模式:
Opengl在发展过程中有两种模式:立即渲染模式和核心模式
立即渲染模式(固定渲染管线):大多数的功能都被隐藏,自由开发受限
核心模式:规范文档废弃了立即渲染模式,鼓励开发(需要了解更多的图像学细节)
扩展
当由opengl有新特性/渲染时,通过扩展的方式在驱动中实现。当显卡支持这个扩展时开发者才能真正使用这个扩展(在驱动代码中由进行判断)
Opengl状态机
Opengl本身是一个状态机,opengl的状态通常被称为opengl上下文。通过上下文变量(转换规则)改变opengl的状态。
状态机:是一种状态到另一种状态的转换;
1.状态(State):描述对象或系统可能处于的不同状态。例如,一个灯可以有两个状态:开和关。
2.输入(Input):触发状态之间转换的外部信号或事件。例如,按下开关按钮可以触发灯的状态转换。
3.转换(Transition):定义从一个状态到另一个状态的条件和行为。转换描述了在给定的输入条件下状态之间的转换规则。
4.输出(Output):定义在状态转换期间或状态变化时执行的动作或产生的结果。例如,在灯状态从关到开时,输出动作可以是灯亮起。
Opengl中对象的概念
对象:是指一些选项的集合,代表opengl状态的子集(可以用一个对象来代表绘图窗口的设置),看作c风格的结构体(struct)
Opengl工作流:
- 首先创建对象,通过glgenobject来创建对象,并用objectID来保存引用
- 将该对象绑定到上下文的目标位置。
- 设置窗口选项,这些选项会保存到objectID的引用对象中。
- 解绑。(解绑后一旦重新绑定,会重新生效)。
创建窗口
为简化opengl的代码,衍生出很多库GLUT,SDL,SFML和GLFW,来辅助开发者使用opengl进行图形编程。
GLFW
是专门针对opengl的c语言库,允许用户创建opengl上下文,定义窗口参数以及处理用户输入。
Glew
配置环境:
- 附加包含目录:(glew,glfw的include文件夹)
2.链接器常规目录:
3.链接器输入目录:
Glew和glfw搭配使用的作用
Glew负责简化和管理opengl扩展的加载
Glfw用于管理窗口,opengl上下文和用户输入
Glew和Glfw的使用流程:
- 对glfw进行初始化;设置版本号,设置profile类型
- Glfw创建窗口,对窗口绑定上下文关系
- 初始化glew
- Glew设置渲染窗口大小
- 通过glfw为判断条件,使用glew进行循环渲染
三角形
顶点数组对象:VAO—用途:用来从VBO/EBO中挖数据,那几个数据是顶点,哪些是法向量,VAO对EBO/VBO进行数据处理
顶点缓存对象:VBO
元素缓存对象:EBO
索引缓冲对象:IBO
顶点着色器:将3D坐标转换成另一种3D坐标
图元装配:所有的点装配成指定图元的形状
几何着色器
光栅化阶段
必须至少一个顶点着色器和一个片段着色器,因为GPU种没有默认的顶点着色器/片段着色器
片段着色器:计算一个像素的最终颜色。(结合光照,阴影,光的颜色)
OpenGL仅仅当3D坐标在3个轴上-1.0~1.0的范围内时才会处理,也叫标准化设备坐标;此范围内才能显示到屏幕内(范围外不显示);