OpenGL学习笔记——初识 骑猪看日落 2022-11-22 00:20 212阅读 0赞 因为也摸索OpenGL一段时间了,不过自己的记性真的有点差,所以就总结一下做一篇笔记。 ### 文章目录 ### * 一、OpenGL简介 * * 1.1用处 * 1.2发展简史 * 1.3存在形式 * 二、OpenGL实现思路 * 三、OpenGL相关工具 * 四、小结 # 一、OpenGL简介 # ## 1.1用处 ## > OpenGL是一种应用程序编程接口(Application Programming Interface,API),它是一种可以对图形硬件设备特性进行访问的软件库。从本质上讲,它是一个3D图形和模型库,具有很高的可移植性,其处理数据的速度也很快。但是它不同于一般的工具包(比如Python中的库),我们不能随心所欲的让他帮我们自动完成我们想要绘制的内容,很多时候我们都需要自己输入数据和控制输出的类型,以达到我们想要的3D效果。 ## 1.2发展简史 ## > 提到OpenGL就不得不提一下SGI公司,其在计算机图形和动画方面一直处于行业的领先地位,OpenGL就脱胎于这家公司的IRIS GL,也因此最初的OpenGL API的许可一直由SGI公司所控制,之后才由ARB(OpenGL机构审核委员会)所控制,该委员会的创立者也包含了许多至今仍非常有名的公司,如IBM、Intel、Microsoft。在委员会成立不久之后,OpenGL1.0规范也正式出台。不过随着时代的发展,SGI也退出了历史舞台,OpenGL标准的控制权也从ARB移交给了一个新的工作组Khronos,该工作组现在继续着OpenGL和其姊妹OpenGL ES的发展与升级。 ## 1.3存在形式 ## > OpenGL主要有两种形式存在。我们通常所说的OpenGL,其实是指OpenGL的实现,它是一个运行时的函数库,软件开发人员可以使用它来生成实时图形。而第二种形式则是指“OpenGL规范”,这个规范包含了OpenGL API、OpenGL的整个状态机,以及各种特性是如何共同工作和运行的。特别要注意的一点就是,OpenGL并不是一门编程语言,所以并不存在“OpenGL程序”之类的东西,其所使用的编程语言主要有两个部分,第一个部分是CPU端的C++或C语言代码,对整个应用程序进行相关的流程和逻辑控制;第二部分则是GPU的着色语言GLSL,其主要是用于渲染操作。 # 二、OpenGL实现思路 # > OpenGL的实现思路其实是类似于我们人类绘画的过程,我们的电脑显示屏其实是一个2D平面,那么怎样才能绘制出3D的物体呢?也就是说怎样才能使得物体在2D平面中不仅具有宽度、高度,还可以让物体具有深度? > 这个问题在很久之前画家们已经给出了答案:2D+透视=3D,也就是通过透视变换就可以给人营造一种3D的错觉。而之所以会这样,深层次的来讲其实这就是我们人类眼睛看待这个世界的方式,我们使用两只眼睛同时观察一个物体,其实在这个过程我们的每一个眼睛都会得到一个临时二维图像,而由于观察的角度不同这就会造成所谓的视差,我们的大脑就会利用视差等等因素对这两幅图像进行组合,最终会在我们的脑海中形成一个单一的、合成的3D图片。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RheXVoYWl0YW5nMQ_size_16_color_FFFFFF_t_70_pic_center] > 除此之外,我们都知道物体离我们越远,物体也就越小,对应上面的图也就是 θ \\theta θ越小。也正因为如此,现实生活中的3D电影就可以通过3D眼镜来增大我们眼睛之间的 θ \\theta θ角度而增强3D效果,也正是这种过度增强,电影院就可以取得他们想要的某种戏剧性的效果。 # 三、OpenGL相关工具 # 辅助我们进行OpenGL相关编程的工具有很多,但是其实对于初学者的我而言,主要就是两类工具: > 第一类,提供窗口控制的工具或者说是库,如GLFW、GLUT等,因为OpenGL并没有包含任何生成窗口和窗口控制的函数,所以就需要第三方的工具来辅助我们开发独立于窗口系统的OpenGL程序。 > 第二类,简化我们获取OpenGL函数地址的工具,如GLEW、GLAD等,因为OpenGL对于不同的制造商而言,只是一种规范而已,不同的显卡制造商可以有不同的显卡驱动,所以这就导致了在编写OpenGL代码时,应用程序在编译阶段并不知道相关的OpenGL函数,而是要等到运行时才能知晓它。这也就造成了如果我们不使用像GLAD这类的辅助工具,我们的程序就需要大量的出现类似于下面的代码。 //定义一个函数指针类型 typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*); //获取相关函数地址 GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers"); //正常的使用该函数 unsigned int buffer; glGenBuffers(1, &buffer); # 四、小结 # 对于我这样的OpenGL初学者而言,仍有许多相关的知识需要学习和了解,可能这会花费很长的时间才能有所成效,但是为了拥有自己的3D软件,我认为是非常值得的\*~\*。 > 参考资料:《OpenGL编程指南》《OpenGL超级宝典》《Learning OpenGL》 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RheXVoYWl0YW5nMQ_size_16_color_FFFFFF_t_70_pic_center]: /images/20221120/4e1de881e96b46e781b1af129cd07b47.png
还没有评论,来说两句吧...