OpenGL学习笔记【1】——简介

一、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 Board,ARB)正式批准该扩展,那么这就被称为一个“标准扩展”,标识符使用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就是这个画家(可以发出各种指令),而画家作画需要用到的画笔、画布等东西就是Context,Context的切换就像画家同时作多幅画,当要画另外一幅画的时候,画家需要放下原来的画笔,拿起了另外一幅画所需要的画笔。

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函数配置GLFW====================
  
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主板本号为3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置副版本号为3
    glfwWindowHint(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头文件
        //终止GLFW
        glfwTerminate();

        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/OpenGL;https://learnopengl-cn.github.io/.

注意:

       OpenGL本身并不是一个API库,它仅仅是一个由Khronos组织制定并维护的跨平台计算机图形应用程序的应用规范

     OpenGL就是一个建立在图形硬件(一般就是gpu)之上的软件编程接口,这些接口具体实现由制造商(一般是显卡制造商)去实现,而编程者通过这些软件编程接口,就可以在计算机中绘制出2D以及3D的图形。

 下一章节:OpenGL学习笔记【2】——开发环境配置(GLFW,VS,Cmake),创建第一个项目-CSDN博客

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于绘制多边形,我会为您提供一些OpenGL学习笔记。 首先,我们需要了解一下OpenGL绘制多边形的基本流程。OpenGL绘制多边形的过程包括三个基本步骤:指定顶点数据、指定绘制方式和执行绘制。 指定顶点数据:在OpenGL中,我们可以使用glVertex等函数来指定多边形的顶点。例如,如果我们要绘制一个三角形,我们可以使用以下代码: ``` glBegin(GL_TRIANGLES); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); ``` 其中,glBegin和glEnd函数用来指定绘制的方式,GL_TRIANGLES表示绘制三角形。glVertex3f函数用来指定三角形的三个顶点,每个顶点由三个坐标值组成。 指定绘制方式:OpenGL支持多种绘制方式,例如GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN等。在上面的代码中,我们使用了GL_TRIANGLES来指定绘制三角形的方式。 执行绘制:最后,我们需要调用glDrawArrays函数来执行绘制。例如,如果我们要绘制一个三角形,我们可以使用以下代码: ``` glDrawArrays(GL_TRIANGLES, 0, 3); ``` 其中,GL_TRIANGLES表示绘制三角形的方式,0表示顶点数组的起始位置,3表示顶点的数量。 以上就是OpenGL绘制多边形的基本流程,下面我们来看一下如何绘制着色多边形。 绘制着色多边形的过程与绘制普通多边形的过程基本相同,只需要在绘制前调用glColor函数来指定颜色即可。例如,如果我们要绘制一个红色的三角形,我们可以使用以下代码: ``` glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); // 指定颜色为红色 glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); ``` 其中,glColor3f函数用来指定颜色,三个参数分别表示红、绿、蓝三个颜色通道的值,取值范围为0到1。 希望以上内容能够帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值