OpenGL 大项目、VAO-s 等

Posted

技术标签:

【中文标题】OpenGL 大项目、VAO-s 等【英文标题】:OpenGL big projects, VAO-s and more 【发布时间】:2015-11-15 13:28:20 【问题描述】:

所以我一直在 https://open.gl/ 上学习 OpenGL 3.3,我对一些东西感到非常困惑。

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

最重要的是如何将所有这些融入到一个大项目中? VAO-s 究竟用于什么用途?大多数教程只涵盖了绘制一个或两个带有硬编码顶点的立方体,那么如何管理具有大量对象的场景呢?我已经阅读了this 线程并且对场景管理是如何发生的以及所有的事情有了一些了解,但我仍然无法弄清楚如何将 OpenGL 的东西连接到这一切。

【问题讨论】:

opengl.org/wiki/Vertex_Specification_Best_Practices, learnopengl.com/#!Getting-started/Shaders这个网站其实很有用! 【参考方案1】:

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-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 指令一次性发送,只需在主循环中的渲染过程中绑定一个,着色器可以在屏幕上绘制场景的过程中为您提供更多控制。

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

【讨论】:

感谢您的精彩回答!现在大部分都变得更清楚了。也许还有一个小问题。你知道一些有趣的小项目或任务可以让我更好地掌握一切吗? 我不知道,但如果你喜欢做一个小游戏项目的话。对于初学者,您可以使用 OpenGL 的即时模式(glBegin()glEnd())来渲染您的图形。然后随着您的进步,尝试将这些调用转换为现代 OpenGL VBO 和其他东西,然后学习 glm(GLmath;一个出色的数学库,可以让您更轻松)并尝试着色器。 再次感谢!我可能会制作一些非常小的游戏来理解这些东西。

以上是关于OpenGL 大项目、VAO-s 等的主要内容,如果未能解决你的问题,请参考以下文章

大数据精品栏目介绍

BigData/Hadoop 项目的典型流程?

深入理解Flink核心技术(转载)

深入理解Flink核心技术

hadoop课程设计

在大纹理上渲染小纹理时,Metal 比 OpenGL 慢得多