1-是的。 VAOs 一般存储顶点数组绑定。当您看到您正在执行大量启用、禁用和更改 GPU 状态的调用时,您可以在程序的早期执行所有这些操作,然后使用 VAO 获取绑定和的“快照”什么不是,在那个时间点。稍后,在您的实际绘图调用期间,您需要做的就是再次绑定 VAO 以将所有顶点状态设置为它们当时的状态。就像VBOs 比立即模式更快,因为它们一次发送所有顶点,VAOs 通过一次更改多个顶点状态来更快地工作。
2-VBO 只是将glPosition、glColor..etc 坐标发送到 GPU 以在屏幕上呈现的另一种方式。这个想法是,与使用gl*Attribute* 调用一一发送顶点数据的即时模式不同,它是提前将所有顶点上传到 GPU 并将它们的位置作为 ID 检索。在渲染时,您只需将 GPU(您将VBO id 绑定到类似GL_ARRAY_BUFFER,并使用glVertexAttribPointer 指定如何存储顶点数据的详细信息)指向该位置并发出您要渲染的订单。这显然通过开销来节省大量时间,因此速度要快得多。
至于每个对象应该有一个VBO,还是所有对象都应该有一个VBO,这取决于程序员和他们要渲染的对象的结构。毕竟,VBOs 本身只是您存储在 GPU 中的一堆数据,您可以使用 glVertexAttribPointer 调用告诉计算机它们是如何排列的。
3-Shaders 用于定义一个管道 - 一个例程 - 顶点、颜色、法线等在它们被发送到 GPU 之后会发生什么,直到它们在屏幕上呈现为片段或像素.当您将顶点发送到 GPU 时,它们通常仍然是 3D 坐标,但屏幕是 2D 像素片。仍然存在根据 ProjectionModelView 矩阵(顶点着色器的工作)重新定位这些顶点的过程,然后将 3D 几何(几何着色器)“展平”或光栅化为 2D 平面。然后对展平的 2D 场景(片段着色器)进行着色,最后相应地照亮屏幕上的像素。在 OpenGL 版本 1.5 及以下版本中,您对这些阶段没有太多控制权,因为它们都是固定(因此称为 fixed pipeline)。想想你可以在这些着色器阶段做些什么,你会发现你可以用它们做很多很棒的事情。例如,在片段着色器中,就在您将片段颜色发送到 GPU 之前,取反颜色的符号并加 1 以使使用该着色器渲染的对象的颜色反转!
至于需要使用多少个着色器,再次由程序员决定是否使用多个着色器。他们可以将所需的所有功能合并到一个大型着色器(超级着色器)中,并使用布尔值uniforms(通常被认为是一种不好的做法)打开和关闭这些功能,或者让每个着色器做某件事并绑定根据他们的需要选择合适的。
这条线到底是做什么的:
glBindFragDataLocation(shaderProgram, 0, "outColor");
这意味着在片段着色器执行结束时存储在out声明的变量“outColor”中的任何内容都将作为最终的主要片段颜色发送到GPU。
最重要的是如何将所有这些融入一个大
程序? VAO-s 究竟用于什么用途?大多数教程只是
只用硬编码的顶点来绘制一个或 2 个立方体,
那么如何去管理有很多对象的场景呢?我有
阅读这个线程并对如何
场景管理发生了,但我仍然不知道怎么做
将 OpenGL 的东西全部连接起来。
他们一起在屏幕上绘制漂亮的彩色形状。 VBOs 是存储场景顶点的结构(都以丑陋的方式对齐),VertexAttribPointer 调用告诉 GPU 如何排列 VBO 中的数据,VAOs 存储所有提前将这些VertexAttribPointer 指令一次性发送,只需在主循环中的渲染过程中绑定一个,着色器可以在屏幕上绘制场景的过程中为您提供更多控制。
所有这一切一开始听起来让人不知所措,但通过练习你会习惯的。