因为近期在学习OpenGL,使用Qt来开发,所以记下笔记,记录下学习过程。
本文主要参考网址是OpenGL中文网:https://learnopengl-cn.github.io/
原网址是:https://learnopengl.com/
1.OpenGL是什么?
OpenGL本质是由Khronos组织并制定的一个规范,并不是一个API。OpenGL规范严格规定了每个函数该如何执行,以及他们的输出值。而内部每个函数如何实现则是由OpenGL库的开发者决定的。OpenGL库的开发者通常是显卡的生产商,所以当产生一个bug(OpenGL库表现的行为和规范规定的不一致)时通常可以通过升级显卡驱动来解决。
目前OpenGL的最新的规范文档是OpenGL 4.6,OpenGL所有的规范文档都被公开寄存在Khronos那里。
2.原始OpenGL和现代OpenGL。
OpenGL根据渲染模式的不同,分为原始OpenGL和现代OpenGL。原始OpenGL是通过立即渲染(固定渲染管线)模式来渲染的,也即先做什么,后做什么很明确,通过glBegin开始绘制,glEnd结束,这么模式容易理解和使用,但是效率低,灵活性也比较差。所以从OpenGL 3.2开始,便抛弃了原始的渲染模式,有了新的渲染模式,核心模式,也叫着色器渲染模式,这中模式灵活性和效率都比较高,而且更容易深入的理解图像编程,但是难度回收为大一些。
所有的OpenGL的高版本都是在OpenGL3.3的基础上引入的功能,没有改变核心架构,所以一般都可以直接引入OpenGL3.3。
3.OpenGL扩展
OpenGL的一大特性是对扩展的支持,所以当一个显卡公司提出了一个新特性或者渲染上的优化,通常会以扩展的方式在驱动中实现,如果一个程序在支持这个扩展的显卡上运行时,开发者就可以使用这个扩展提供的更先进有效的功能,这样就不需要等到OpenGL新的规范发布,通常只需要检查下显卡是否支持这个扩展即可。通常当一个扩展非常流行使用时,就会成为OpenGL规范的一部分。
4.图形渲染管线(Graphics Pipline)
在OpenGL中,任何事物都在3D空间中,而屏幕和窗口则是2D像素数组,所以OpenGL的大部分工作是把3D坐标转成适应屏幕的2D像素坐标,这个过程就是通过图形渲染管线处理的,所以图形渲染管线的工作主要是两部分:1.把3D坐标转成2D坐标;2.把2D坐标转成实际有颜色的像素。
5.着色器(Shader)
图形渲染管线可以分为几个阶段,每个阶段都是把前一阶段的输出作为后一阶段的输入,这些阶段都是高度专门化的,具有并行处理的特征,每个显卡上有成千上万个小核心处理器,它们在GPU上为每个阶段运行各自的小程序,从而快速的处理图形渲染过程,这些小程序就是着色器。着色器使用着色器语言(GLSL)写成的。因为GPU中没有默认的顶点和片段着色器,所以至少要定义顶点着色器和一个片段着色器。
一个图形渲染管线的过程大致是这几部分:
顶点着色器是把3D坐标转成另一种3D坐标(标准化坐标,值在-1到1之间,超过-1和1的都会被裁剪或丢弃),通常传入的是一个3D坐标数组,包含xyz。
图元装配则是把顶点着色器的输出作为输入,将所有的点装配成需要的图元,如点,三角形等。
几何着色器是把图元形式的点作为集合,通过产生新的顶点生成新的图元来生成其他形状。
光栅化是把图元映射为最终屏幕上相应的像素,最终生成供片段着色器使用的片段。
片着色器的目的是计算每个像素最终的颜色。
Alpha测试和混合阶段,这个阶段会检测片段对应的深度值,来判断这个像素在其他物体的前边还是后边,并考虑手否要丢弃,还要检测Alpha(透明度)值,并对物体进行混合(Blend),所以即使片段着色器计算出一个像素的颜色,在渲染多个三角形的时候最后的像素颜色也可能不同。