OpenGL大型项目、VAO等

OpenGL big projects, VAO-s and more

本文关键字:VAO 大型项目 OpenGL      更新时间:2023-10-16

所以我一直在学习OpenGL 3.3https://open.gl/我真的对一些事情感到困惑。

  1. VAO-s。据我所知,它们用于存储glVertexAttribPointer调用
  2. VBO-s。它们储存着倾斜度。那么,如果我用多个对象制作某个东西,我是否需要每个对象都有一个VBO
  3. 着色器程序-为什么我们需要多个着色器程序,它们到底做什么
  4. 这行到底做什么:glBindFragDataLocation(shaderProgram,0,"outColor")

最重要的是,所有这些如何融入一个大项目?VAO究竟用于什么?大多数教程只涉及绘制具有硬编码顶点的立方体或2,那么如何管理具有大量对象的场景呢?我读过这个帖子,对场景管理是如何发生的有了一点了解,但我仍然不知道如何将OpenGL的东西连接到这一切。

1-是。VAOs通常存储顶点数组绑定。当你看到你正在进行大量调用来启用、禁用和更改GPU状态时,你可以在程序的早期完成所有这些操作,然后使用VAO在那个时间点拍摄一个"快照",记录哪些是绑定的,哪些不是绑定的。稍后,在实际的绘制调用中,您所需要做的就是再次绑定VAO,以将所有顶点状态设置为当时的状态。就像VBOs因为一次发送所有顶点而比即时模式更快一样,VAOs通过一次更改多个顶点状态而工作得更快。

2-VBO只是发送glPositionglColor的另一种方式。。etc坐标到GPU以在屏幕上渲染。与即时模式不同,即时模式通过gl*Attribute*调用逐个发送顶点数据,而是提前将所有顶点上传到GPU,并将其位置作为ID检索。在渲染时,您只需要将GPU(将VBO id绑定到类似GL_ARRAY_BUFFER的东西,并使用glVertexAttribPointer指定如何存储顶点数据的详细信息)指向该位置,然后发出渲染命令。这显然节省了大量的时间,通过做一些开销的事情,所以速度要快得多。

至于是每个对象应该有一个VBO,还是所有对象都应该有一个子VBO,这取决于程序员和他们想要渲染的对象的结构。毕竟,VBOs本身只是你存储在GPU中的一堆数据,你可以使用glVertexAttribPointer调用告诉计算机它们是如何排列的。

3-着色器用于定义顶点、颜色、法线的管道(例程)。。等等,直到它们被呈现为屏幕上的片段或像素。当您将顶点发送到GPU时,它们通常仍然是3D坐标,但屏幕是一张2D像素表。仍然需要根据ProjectionModelView矩阵重新定位这些顶点(顶点着色器的工作),然后将3D几何体(几何着色器)"展平"或光栅化为2D平面。然后,它对平坦的2D场景(片段着色器)进行着色,并最终相应地照亮屏幕上的像素。在OpenGL 1.5核心及以下版本中,您无法对这些阶段进行太多控制,因为它都是固定的(因此术语fixed pipeline)。只要想想你在这些着色器阶段中可以做什么,你就会发现你可以用它们做很多很棒的事情。例如,在片段着色器中,就在将片段颜色发送到GPU之前,求反颜色的符号并加1,以反转使用该着色器渲染的对象的颜色!

至于需要使用多少着色器,同样,由程序员来决定是否使用许多着色器。他们可以将所有需要的功能合并到一个巨大的着色器(超级着色器)中,并使用布尔uniforms打开和关闭这些功能(通常被认为是一种糟糕的做法),或者让每个着色器都做某件事,并根据需要绑定正确的着色器。

这条线到底做什么:glBindFragDataLocation(shaderProgram, 0, "outColor");

这意味着,在片段着色器执行结束时,存储在out声明变量"outColor"中的任何内容都将作为最终的主片段颜色发送到GPU。

最重要的是,所有这些如何融入一个大程序VAO究竟用于什么?大多数教程只是只涉及绘制具有硬编码顶点的立方体或2,那么,如何管理具有大量对象的场景呢?我已经阅读这篇文章,对场景管理发生了,但我仍然不知道如何将OpenGL的东西连接到它上面。

他们一起在屏幕上画出你漂亮的彩色形状。VBO s是存储场景顶点的结构(所有顶点都以丑陋的方式对齐),VertexAttribPointer调用来告诉GPU VBO中的数据是如何排列的,VAO s提前存储所有这些VertexAttribPointer指令,并在主循环中渲染期间通过简单的绑定一个指令一次发送它们,和着色器,以便在屏幕上绘制场景的过程中提供更多控制。

所有这些一开始听起来可能让人不知所措,但经过练习,你会习惯的。