OpenGL 大项目、VAO-s 等

OpenGL big projects, VAO-s and more

所以我一直在 https://open.gl/ 上学习 OpenGL 3.3,我对一些东西真的很困惑。

  1. VAO-s。据我了解,它们用于存储 glVertexAttribPointer 次调用。
  2. VBO-s。他们存储顶点。所以如果我用多个对象制作东西,我需要为每个对象创建一个 VBO 吗?
  3. 着色器程序 - 为什么我们需要多个着色器程序以及它们的具体作用?
  4. 这一行到底做了什么:glBindFragDataLocation(shaderProgram, 0, "outColor");

最重要的是所有这些如何适应一个大程序? VAO-s 究竟用于什么?大多数教程只涵盖了绘制一个或两个带有硬编码顶点的立方体的内容,那么如何管理包含大量对象的场景呢?我已经阅读了 this 线程并对场景管理如何发生有了一些了解,但我仍然无法弄清楚如何将 OpenGL 的东西连接到它。

1-是的。 VAOs 一般存储顶点数组绑定。当您看到您正在执行大量启用、禁用和更改 GPU 状态的调用时,您可以在程序的早期执行所有这些操作,然后使用 VAO 获取 "snapshot" ,什么是绑定和什么不是,在那个时间点。稍后,在您实际的绘制调用期间,您需要做的就是再次绑定 VAO 以将所有顶点状态设置为它们当时的状态。就像 VBOs 比立即模式更快因为它们一次发送所有顶点一样,VAOs 通过一次更改许多顶点状态来更快地工作。

2-VBO 只是将您的 glPositionglColor.. 等坐标发送到 GPU 以在屏幕上渲染的另一种方式。这个想法是,与您使用 gl*Attribute* 调用一个一个地发送您的顶点数据的即时模式不同,它是预先将所有顶点上传到 GPU 并检索它们的位置作为 ID。在渲染时,你只需要指向 GPU(你将 VBO id 绑定到 GL_ARRAY_BUFFER 之类的东西,并使用 glVertexAttribPointer 指定你如何存储顶点数据的细节) 到该位置并发出渲染命令。显然,通过在开销上做事可以节省大量时间,因此速度要快得多。

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

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

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

What exactly does this line do : glBindFragDataLocation(shaderProgram, 0, "outColor");

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

The most important thing is how does all of this fit into a big program? For what exactly are used the VAO-s? Most tutorials just cover the things just to drawing a cube or 2 with hard coded vertices, so how would one go to managing scenes with a lot of objects? I've read this thread and got a little bit of understanding on how the scene management happens and all but still I can't figure out how to connect the OpenGL stuff to it all.

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

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