OpenGL学习记录(一)

中文版教程: learnopengl
OpenGL的环境配置:OpenGL本身是一个标准API,具体实现基本由各个显卡开发商实现,通过显卡驱动与OS对接提供支持。也就是说,理论上你可以用驱动程序库来进行图形编程,当然这么做需要官方SDK的支持,而且也不能保证跨平台。OpenGL环境的配置首先需要OpenGL Loading Library的支持,如GLEW和GLAD。关于Loading Library,可以去OpenGL Wiki上了解,事实上动态链接库都需要这样的Loading Library来加载函数指针(Linux中负责实现这个功能的模块被封装进了.so文件中),比如Windows下生成.dll会同时生成.lib的Loading Library,因此也可以去MSDN文档看看有关知识。除了GLEW/GLAD之外,还需要别的库来负责处理创建上下文、窗口创建和用户输入等任务,最常用的应该是GLFW和freeglut。在OpenGL Wiki中,官方称完全可以自己实现这种库的功能,但是他们推荐新手使用第三方库。
OpenGL被定义成一个巨大的状态机, 创建这个状态机的具体方法就是创建OpenGL上下文(context)。为什么强调是一个状态机?因为OpenGL的渲染系统被这样设计:创建物体被渲染所需要的状态,选择要被渲染的物体,然后将二者结合输出渲染结果。所以基本上OpenGL通过不断改变上下文状态来决定渲染结果并且输出,它提供的接口也大多用于“改变上下文状态“和”使用上下文状态“。
下面看看具体代码。在教程中,我们碰到的第一个函数是glGenBuffers。这里涉及到OpenGL Objects的概念,它在Wiki中被定义成“状态的容器”。Buffer Object(缓冲对象)是最常见的一种OpenGL Objects。我们可以仔细考察一下生成Buffer Object的过程:

float vertices[] = {/* floats of vertices */};
unsigned int vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

为了理解这些代码,还需要知道这样的事实:OpenGL Objects都是有name的,name是在某一时刻的上下文内唯一的、但在对象删除后可被回收利用的,OpenGL使用这些name来引用对象。name都是正整数,0是保留name。
让我们再来看看这段代码做了些什么。首先它创建了一个数组储存顶点坐标,然后创建了一个正整数变量vbo(vertex buffer object)用以储存接下来要生成的buffer的name。然后滴哦啊用了glGen*函数来生成buffer,数量为一个并且将name储存到vbo中(所以name一定程度上是匿名的)。然后,它调用了glBind*对buffer进行一个绑定操作。
何为绑定操作?我们强调,OpenGL是一个状态机,而OpenGL Objects是状态的容器,绑定操作的目的就是将buffer绑定到OpenGL的上下文中以此来改变OpenGL状态机的状态。OpenGL上下文中有用于绑定的位点,称为目标(Target)。这个目标在这里是GL_ARRAY_BUFFER;一旦将buffer绑定到这个目标上,这个buffer的可操作性就被确定了。然后就是向这个目标填充数据,调用glBufferData。
其实这里的行为与定义变量非常相似。如果你仔细考虑过什么是变量,那么很容易理解:变量就是地址+操作+数据,并且在我们手中还多了一个标识符。为了创建一个buffer object,我们先创建一个标识符的容器(正整数vbo),然后(由于OpenGL的name机制)将生成的name放入这个容器中。接下来我们通过绑定定义了对于这个object,哪些操作是合法的(GL_ARRAY_BUFFER)。最后我们为object分配空间,初始化它的数据(包括它该如何被使用)。
其实这里还涉及到OpenGL设计的问题,比如在将buffer绑定到状态机的目标上之后,通过调用目标来向buffer填充数据(而非直接调用name)。这里面的一个点就是,许多操作总是要经过上下文的,这也许是一种设计,也许是因为C/S模式的要求和CPU-GPU交互的限制,留待进一步学习。

posted @   日露名乃  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示