c++ - OpenGL:准备要发送给着色器的数据困惑

标签 c++ opengl

对于如何设置我的应用程序以将数据发送到我的着色器并进行绘制,我有点困惑。我知道我必须生成一个 VAO,绑定(bind)它,生成缓冲区对象,绑定(bind)它们,用数据填充它并创建一个属性指针来引用缓冲区对象中的数据,因为 openGL 红皮书告诉我......但是我实际上不知道这个过程中发生了什么。有人可以逐步解释这个过程并解释发生了什么吗?为我和其他不太了解此过程的人澄清这一点。另外,VAO 实际上做了什么?我知道我可以使用属性指针引用缓冲区对象中的数据并且它会正常工作,那么 VAO 有什么意义呢?

最佳答案

顶点数组对象 (VAO) 是包含一组顶点缓冲区对象的对象,旨在存储完整渲染对象或完整渲染批处理的信息。如果您不使用 VAO,则对于每个批处理,您都必须一个接一个地绑定(bind)所有 VBO。对于 VAO 中批处理中的所有 VBO,您只需绑定(bind) VAO 一次,而不是绑定(bind)所有 VBO。

顶点缓冲区对象 (VBO) 是视频卡高速内存中的内存缓冲区,旨在保存有关顶点的信息。 VBO 可以存储法线、纹理坐标、顶点等信息。这就是为什么您必须使用属性指针让着色器知道 VBO 内部的内容。 VBO 提供了比即时模式呈现显着的性能提升,主要是因为数据驻留在视频设备内存中而不是系统内存中,因此它可以直接由视频设备呈现。

您必须绑定(bind) VBO 或 VAO,让 OpenGL 知道您将在下一个绘制调用中绘制什么,或者您将使用某些 VBO 并告诉 OpenGL 让它们准备好使用。

关于c++ - OpenGL:准备要发送给着色器的数据困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22318895/

相关文章:

c++ - 英伟达 NSight "process creation failure"

performance - 多次渲染同一个模型

opengl - Qt 5.5.1 : Cannot find -lGL

javascript - Qt Qml Javascript - 在哪里使用哪个?

c++ - 创建全局动态分配数组

c++ - RAM 上的存储单元是如何组织的,它与 C++ 有什么关系?

linux - OpenGL 应用程序导致 Xorg 泄漏

opengl - 计算着色器在调用(线程)和工作组上的最佳数据划分

c++ - ifstream 找不到保存在目录中的文件

来自 win32 事件 Hook 的 c++ 回调