OpenGL大型项目、VAO等
OpenGL big projects, VAO-s and more
所以我一直在学习OpenGL 3.3https://open.gl/我真的对一些事情感到困惑。
- VAO-s。据我所知,它们用于存储
glVertexAttribPointer
调用 - VBO-s。它们储存着倾斜度。那么,如果我用多个对象制作某个东西,我是否需要每个对象都有一个VBO
- 着色器程序-为什么我们需要多个着色器程序,它们到底做什么
- 这行到底做什么:glBindFragDataLocation(shaderProgram,0,"outColor")
最重要的是,所有这些如何融入一个大项目?VAO究竟用于什么?大多数教程只涉及绘制具有硬编码顶点的立方体或2,那么如何管理具有大量对象的场景呢?我读过这个帖子,对场景管理是如何发生的有了一点了解,但我仍然不知道如何将OpenGL的东西连接到这一切。
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-着色器用于定义顶点、颜色、法线的管道(例程)。。等等,直到它们被呈现为屏幕上的片段或像素。当您将顶点发送到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
指令,并在主循环中渲染期间通过简单的绑定一个指令一次发送它们,和着色器,以便在屏幕上绘制场景的过程中提供更多控制。
所有这些一开始听起来可能让人不知所措,但经过练习,你会习惯的。
- 如何在大型c++项目的可视化代码中设置调试
- 为大型项目编写固件时应注意的注意事项
- 如何在 Eclipse 中链接大型C++项目
- 优点和缺点 在类内为大型项目定义的内联朋友助手免费函数
- makefile和错误将与大型项目分开的文件编译
- 在QT中的大型项目中指定构建/目标/安装路径
- 从Netbeans到Eclipse的大型C 项目的迁移
- 对于大型C/C++项目,在编译时使用GNU m4
- 如何使用x64编译器使用MsBuild.exe编译大型c++项目
- 使用GDB修复大型项目中的双自由或损坏(!prev)错误
- 确保每个标头在大型项目中使用唯一的包含保护
- 在大型C/C 项目中访问现有字段
- C 通过使用库来提高大型项目的构建速度
- 如何在大型项目中使用-fsplit -stack
- 大型项目C++例外
- 使用 C++11 std::元组在大型项目中
- 构建大型项目时,NDK构建会卡住/悬挂
- 如何在C++中处理大型项目
- 如何为大型项目制作一个简单的工具来检测Linux中的双倍空闲或内存溢出
- OpenGL大型项目、VAO等