WTF
OpenGL 是一种应用程序编程接口(Application Programming Interface, API),它是一种可以对图形硬件设备特性进行访问的软件库。OpenGL 被设计为一个现代化的、硬件无关的接口,因此我们可以在不考虑计算机操作系统或窗口系统的前提下,在多种不同的图形硬件系统上,或者完全通过软件的方式(如 果当前系统没有图形硬件)实现 OpenGL 的接口。OpenGL 自身并不包含任何执行窗口任务 或者处理用户输入的函数。
一个用来渲染图像的 OpenGL 程序需要执行的主要操作如下所示。
- 从 OpenGL 的几何图元中设置数据,用于构建形状。
- 使用不同的着色器(shader)对输入的图元数据执行计算操作,判断它们的位置、颜色,以及其他渲染属性。
- 将输入图元的数学描述转换为与屏幕位置对应的像素片元(fragment)。这一步也称作光栅化(rasterization)。
- 最后,针对光栅化过程产生的每个片元,执行片元着色器(fragment shader),从而决定这个片元的最终颜色和位置。
- 如果有必要,还需要对每个片元执行一些额外的操作,例如判断片元对应的对象是否可见,或者将片元的颜色与当前屏幕位置的颜色进行融合。
OpenGL 是使用客户端 - 服务端的形式实现的,我们编写的应用程序可以看做客户端,而计算机图形硬件厂商所提供的 OpenGL 实现可以看做服务端。
Begining
环境搭建 参考这篇
渲染流程如下图
其中常用的是顶点着色器(决定位置)和片元着色器(决定片元的存在与颜色)
说说坐标
对了这时候需要补充一下坐标的概念, OpenGL是右手坐标系,默认以屏幕的中心为远点(0,0,0), 往右为x正方向,往上为y正方向,垂直于屏幕向外为z正方向,坐标中每个点的范围为[-1 ,1]
伸出右手,手心面对自己,中指指向自己,则拇指指向x+,食指指向y+,中指指向z+。
有了坐标的概念,就可以先搞个简单的图形了
/// 顶点数据
GLfloat vVerts[] = {
-0.5f, 0.0f, 0.0f, // 依次表示x,y,z的坐标值
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f
};
这是个简单三角形,然而复杂的图形也都是一个个坐标拼出来的。具体的着色器如何渲染图形,会放到另一篇文章来分析。
看到这里,我们便可以画一些简单的图形了。