博主最近三个月基本都在学习OpenGL,主要是想了解视频、图片渲染背后的原理,基本现在算是入门了吧 这算是我个人总结入门篇的内容,有兴趣的大佬可以一起探讨,好了,开始进入主题。
1、OpenGL是个什么东西?
OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。
至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。
因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。
实际的OpenGL库的开发者通常是显卡的生产商。
你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。
当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。
在Linux下,有显卡生产商提供的OpenGL库,也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时,
基本都是库的开发者留下的bug。
2、GLAD: 一个拓展加载库,用来为我们加载并设定所有OpenGL函数指针,从而让我们能够使用所有(现代)OpenGL函数
3、对于设计窗口的设计,大家可以有很多选择,比如glfw、sdl等(sdl一般多用于游戏开发)
4、可以从选择一个简单的图形开始,有几个重要的概念:
a、Vertex Buffer Object:顶点数据缓冲 一个调用显存并存储所有顶点数据供显卡使用的缓冲对象
b、Vertex Array Object: 顶点数组对象 存储缓冲区和顶点属性状态
c、Element Buffer Object:索引缓存对象 一个存储索引供索引化绘制使用的缓冲对象
5、着色器的概念,着色器这个东西很重要,从我们传入顶点数据开始,到交由着色器,再由显卡渲染出来数据, 大家可以看这个图着色器图
对了,如果我们需要自定义着色器开发,需要了解一下GLSL语言, 它和C语言其实很类似,里面还包括Uniform等
6、纹理:一种包裹着物体的特殊类型图像,给物体精细的视觉效果,说白了就是较少cpu对于图形计算,通过纹理 传输数据压缩,由GPU操作,带来性能上的提升
纹理缠绕(Texture Wrapping): 定义了一种当纹理顶点超出范围(0, 1)时指定OpenGL如何采样纹理的模式。
纹理过滤(Texture Filtering): 定义了一种当有多种纹素选择时指定OpenGL如何采样纹理的模式。这通常在纹理被放大情况下发生。
多级渐远纹理(Mipmaps): 被存储的材质的一些缩小版本,根据距观察者的距离会使用材质的合适大小
7、GLM库,一个为OpenGL打造的数学库,向量、矩阵计算,平移、旋转、缩放等等(事实证明,数学很重要) 坐标系统,3D构建的过程, V(clip) = M(projection) * M(view) * M(model) * V(local) 投影矩阵 观察矩阵 模型矩阵 局部向量,我们的坐标位置
局部空间(Local Space): 一个物体的初始空间。所有的坐标都是相对于物体的原点的。
世界空间(World Space): 所有的坐标都相对于全局原点。
观察空间(View Space): 所有的坐标都是从摄像机的视角观察的。
裁剪空间(Clip Space): 所有的坐标都是从摄像机视角观察的,但是该空间应用了投影。这个空间应该是一个顶点坐标最终的空间,作为顶点着色器的输出。OpenGL负责处理剩下的事情(裁剪/透视除法)。
屏幕空间(Screen Space): 所有的坐标都由屏幕视角来观察。坐标的范围是从0到屏幕的宽/高。