寻找网站开发,信息查询系统,四川省城乡住房与建设厅网站,昆明网络公司排行榜一、OpenGL概念 OpenGL (Open Graphics Library#xff0c;译名#xff1a;开放式图形库开放式图形库) 是一种用于渲染 2D 和 3D 图形的跨语言、跨平台的编程接口(API)。
二、OpenGL跨语言 OpenGL 是一个 C 语言库#xff0c;因此理解 C 语言#xff08;或 C#xff09;的…一、OpenGL概念 OpenGL (Open Graphics Library译名开放式图形库开放式图形库) 是一种用于渲染 2D 和 3D 图形的跨语言、跨平台的编程接口(API)。
二、OpenGL跨语言 OpenGL 是一个 C 语言库因此理解 C 语言或 C的基本知识是非常有用的。然而许多其他语言也有 OpenGL 的绑定值得一提的包括
(1)JavaScript绑定的WebGL(基于OpenGL ES 2.0在Web浏览器中的进行3D渲染的API)
(2)C绑定的WGL、GLX和CGL;
(3)iOS提供的C绑定;
(4)Android提供的Java和C绑定;
所以你可以选择你最熟悉的语言来学习。
三、OpenGL跨平台 OpenGL 提供了一组底层的图形渲染函数严格规定了每个函数该如何执行以及它们的输出值这些函数可以直接与图形硬件交互实现高效的图形渲染。至于内部具体每个函数是如何实现(Implement)的将由OpenGL库的开发者通常是显卡的生产商自行决定。 OpenGL被设计为只有输出的只提供渲染功能核心API没有窗口系统、音频、打印、键盘/鼠标或其他输入设备的概念也正是这种限制使得OpenGL允许进行渲染的代码完全独立于它运行的操作系统允许跨平台开发。 OpenGL没有提供着色器编译器而是由显卡驱动来完成着色器的编译工作也就是说只要显卡驱动支持对GLSL的编译它就能运行所以能够跨平台。具有强大的通用性和可移植性可以将其轻松的移植在多个不同的平台上进行二次开发。因为OpenGL本身是一个与硬件无关的软件接口所以通用于市面上较为流行的平台比如Windows、Unix、Linux、MacOS等。
四、OpenGL扩展特性 OpenGL的一大特性就是对扩展Extension)的支持当一个显卡公司提出一个新特性或者渲染上的大优化通常会以扩展的方式在驱动中实现。扩展可能会引入新功能和新常量并且可能放松或取消现有的OpenGL函数的限制。然后一个扩展就分成两部分发布包含扩展函数原型 的头文件和作为厂商的设备驱动。供应商使用扩展公开自定义的API而无需获得其他供应商或Khronos Group的支持这大大增加了OpenGL的灵活性。 每个扩展都与一个简短的标识符 关系该标识符基于开发公司的名称。例如英伟达nVidia的标识符是NV。如果多个供应商同意使用相同的API来实现相同的功能那么就用EXT标志符。这种情况更进一步Khronos Group的架构评审委员Architecture Review BoardARB正式批准该扩展那么这就被称为一个“标准扩展”标识符使用ARB。 OpenGL是一个不断进化的API新版OpenGL规范会定期由Khronos Group发布新版本通过扩展API来支持各种新功能。OpenGL 更像是一种显卡驱动标准,由各个硬件厂家适配,各个硬件厂商根据 OpenGL 接口规范编撰对应的驱动换句话说,对于各个硬件厂商 OpenGL 确实是一个基于 GPU 的软件实现,但是对于普通的应用层开发者 OpenGL 就是一个由硬件厂商提供的驱动程序罢了。 在OpenGL的发展历程中总是兼顾向下兼容的特性但是到了一定的程度之后这些旧有的OpenGL API不再适应时代的需要还有一些扩展并不是驱动一定要实现的扩展这些被统一划入可选的Compatibility Profile而由OpenGL规范规定必须支持的扩展则是Core Profile想要支持先进的OpenGL相应的Core Profile扩展必须被实现。
五、OpenGL 上下文
5.1、Context上下文的理解 OpenGL Context中文解释就是OpenGL的上下文。OpenGL只是图形API它只负责渲染渲染指令执行所需要的那些东西就是Context。 OpenGL在渲染的时候需要一个Context来记录了OpenGL渲染需要的所有信息和状态可以把它理解成一个大的结构体它里面记录了当前绘制使用的颜色、是否有光照计算以及开启的光源等。 对于OpenGL的上下文的理解看到一个比较形象的比喻好比一个画家在画图OpenGL就是这个画家可以发出各种指令而画家作画需要用到的画笔、画布等东西就是ContextContext的切换就像画家同时作多幅画当要画另外一幅画的时候画家需要放下原来的画笔拿起了另外一幅画所需要的画笔。
5.2、Context上下文的历史版本 (1)在OpenGL 3.0版本之前OpenGL创建Context都是一致的 (2)但是从OpenGL 3.0开始为了摆脱历史的“包袱”OpenGL想要彻底的废弃掉之前的许多特性但是无奈市面上已经有大量依赖OpenGL之前版本的代码导致OpenGL维护小组的这一想法难以付诸实施 OpenGL 3.0 引入了废弃机制标记了许多OpenGL的函数是废弃的但是3.0并没有真正移除它们也就是说3.0版本仍然是一个可以向后兼容的Context; (3)在OpenGL 3.1的发布删除了之前3.0标记的过时函数固定管线相关的函数但是为了之前的OpenGL代码可用 引入了一个扩展ARB_compatibility这个扩展可以让OpenGL 3.1支持之前的OpenGL固定管线的内容 4)OpenGL 3.2中开始引入了OpenGL Context的一些分类正式引入了模式的概念Profile之后随着版本发展到OpenGL 3.3一切算是确定下来。 (5)到了OpenGL3.3之后OpenGL的context profile分为了两个版本core pfofile和compatibility profile前者表示删除任何标记为deprecated弃用的功能后者则表示不删除任何功能。 5.3、创建上下文context使用的图形界面框架 不同的操作系统都有各自的上下文创建方法和设置当前上下文的API最简单的上下文可以通过Glut或是Glfw创建相比较而言glfw是一个轻量级的图形界面框架托管在 www.glfw.org现在非常的活跃如果新入门可以优先考虑glfw相关的教程网上也比较多。 使用glfw创建一个窗口并使该窗口的上下文成为当前上下文 // 设置窗口提示glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // OpenGL主版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // OpenGL次版本号glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用核心模式// 创建窗口GLFWwindow* window glfwCreateWindow(800, 600, LearnOpenGL, NULL, NULL);if (window NULL) {glfwTerminate();return -1;}// 使窗口上下文当前上下文glfwMakeContextCurrent(window); 创建了绘制上下文并设置为当前上下文以后还不能使用OpenGL最新的特性
一般我们使用Glfw库首先初始化GLFW库即需要调用glfwInit()得到OpenGL随显卡驱动一起发布的新特性的函数入口地址。 //初始化GLFW得到OpenGL随显卡驱动一起发布的新特性的函数入口地址glfwInit();//下面glfwWindowHint函数配置GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主板本号为3glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置副版本号为3glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//核心模式(Core-profile)//参数1选项的名称。可以从很多以GLFW_开头的枚举值中选择//参数2接受一个整型用来设置这个选项的值//设置版本号为3.3版本,需要告诉GLFW我们要使用的OpenGL版本是3.3//GLFW会在创建OpenGL上下文时做出适当的调整。//这也可以确保用户在没有适当的OpenGL版本支持的情况下无法运行//如果你使用的是Mac OS X系统你还需要解除下面这行代码的注释//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);// 创建窗口对象GLFWwindow* window glfwCreateWindow(800, 600, LearnOpenGL, NULL, NULL);if (window NULL) {//创建窗口对象失败打印错误信息std::cout Failed to create GLFW window std::endl;//需要引用iostream头文件//终止GLFWglfwTerminate();return -1;}//参数1窗口宽//参数2窗口高//参数3窗口标题名字//参数4参数5暂时忽略//返回值类型GLFWwindow*我们会在其它的GLFW操作中使用到// 使窗口上下文当前上下文glfwMakeContextCurrent(window); 5.4、线程私有 OpenGL的绘制命令都是作用在当前的Context上这个Current Context是一个线程私有thread-local的变量也就是说如果我们在线程中绘制那么需要为该线程制定一个Current Context的当多个线程参与绘制任务时需要原线程解绑再重新绑定新的线程。多个线程不能同时指定同一个Context为Current Context否则会导致崩溃。
六、OpenGL的开发模式
6.1、立即渲染模式 (Compatibility Profile) Compatibility Profile兼容之前的OpenGL固定管线的内容也可以使用Core Profile中的内容。 早期的OpenGL使用立即渲染模式Immediate mode也就是固定渲染管线OpenGL 3.2版本以前都是该模式该模式固定以glBegin开始绘制以glEnd结束绘制明确规定了先做什么后做什么有一套固定的函数和执行流程开发者可以“傻瓜式”的使用这些函数来实现渲染效果它面向过程比较简单、易于理解但是灵活性固定的执行流程和性能都较差CPU与GPU通信频繁。
6.2、 核心模式(Core Profile) 核心模式即着色器渲染模式从3.2版本开始废弃了立即渲染模式开发者通过编写shader来完成图形的渲染常见的shader有vertex shader和fragment shader这种模式较为灵活和高效但是比较复杂。 从OpenGL3.2开始规范文档开始废弃立即渲染模式并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发这个分支的规范完全移除了旧的特性。当使用OpenGL的核心模式时OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时OpenGL会抛出一个错误并终止绘图。 现今更高版本的OpenGL已经发布写作时最新版本为4.6你可能会问既然OpenGL 4.6 都出来了为什么我们还要学习OpenGL 3.3答案很简单所有OpenGL的更高的版本都是在3.3的基础上引入了额外的功能并没有改动核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。因此所有的概念和技术在现代OpenGL版本里都保持一致。当你的经验足够你可以轻松使用来自更高版本OpenGL的新特性。 除了core profile核心渲染模式和compatibility profile立即渲染模式外还有一种模式foward compatibility这个表示所有标记为deprecated的函数都禁用这个模式只对opengl3.0及以上的版本有效。但这个选项对OpenGL 3.2 compatibility Profile Context没有任何作用。
七、OpenGL需要了解的技术和知识
1、计算机图形学基础理解基本的计算机图形学概念如向量、矩阵、变换、光照、纹理等可以帮助你更好地理解和使用 OpenGL。这些主题通常在计算机图形学的入门课程中介绍。 2、线性代数在计算机图形学中我们经常需要处理 2D 或 3D 空间中的点和向量这需要一些线性代数的知识。至少要熟悉向量的加法、减法和点积以及如何使用矩阵进行变换。 3、计算机硬件理解计算机硬件特别是图形处理器 (GPU) 的基本工作原理可以帮助你理解 OpenGL 的许多设计决策以及为什么某些操作比其他操作更快。 4、IDE 和调试工具熟悉一个集成开发环境如 Visual Studio、Eclipse 或者 PyCharm将会对你编写和调试代码非常有帮助。此外学习使用像 gDEBugger 或者 RenderDoc 这样的 OpenGL 调试工具也是很有用的。 5、API 文档和教程熟悉 OpenGL 的官方文档或你正在使用的语言绑定的文档。这将是你在学习和使用 OpenGL 时的重要资源。同时还有许多优秀的在线教程如https://learnopengl.com/Getting-started/OpenGLhttps://learnopengl-cn.github.io/.