什么是顶点数组对象?

2024-02-12

我今天刚刚开始从本教程学习 OpenGL:http://openglbook.com/the-book/ http://openglbook.com/the-book/
我读到了第二章,画了一个三角形,除了 VAO(这个缩写可以吗?)之外,我理解了所有内容。教程中有这样的代码:

glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);

虽然我知道代码是必要的,但我不知道它的作用。尽管在此之后我从未使用过 VaoId(除了销毁它),但如果没有它,代码将无法运行。我假设这是因为它需要绑定,但我不知道为什么。这个确切的代码是否只需要成为每个 OpenGL 程序的一部分?本教程将 VAO 解释为:

顶点数组对象(或 VAO)是描述顶点属性如何存储在顶点缓冲区对象(或 VBO)中的对象。这意味着VAO并不是存储顶点数据的实际对象,而是顶点数据的描述符。顶点属性可以通过 glVertexAttribPointer 函数及其两个姐妹函数 glVertexAttribIPointer 和 glVertexAttribLPointer 来描述,我们将在下面探讨第一个函数。

我不明白VAO如何描述顶点属性。我没有以任何方式描述它们。它是否从 glVertexAttribPointer 获取信息?我想一定是这个了。 VAO 只是来自 glVertexAttribPointer 的信息的目的地吗?

顺便说一句,我遵循的教程可以接受吗?有什么我应该注意的或者更好的教程可以遵循吗?


“顶点数组对象”是由 OpenGL ARB 愚蠢名称小组委员会为您带来的。

将其视为一个几何对象。 (作为一个旧时的 SGI Performer 程序员,我称它们为 geoset。)对象的实例变量/成员是顶点指针、法线指针、颜色指针、attrib N 指针,...

当第一次绑定 VAO 时,您可以通过调用来分配这些成员

glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer...;
glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer...;

等等。启用哪些属性以及您提供的指针存储在 VAO 中。

之后,当您再次绑定VAO时,所有这些属性和指针也将变为当前值。那么一个glBindVertexArray调用相当于之前设置所有属性所需的所有代码。它可以很方便地在函数或方法之间传递几何图形,而无需创建自己的结构或对象。

(一次设置,多次使用是使用 VAO 的最简单方法,但您也可以通过绑定它并进行更多启用/指针调用来更改属性。VAO 不是常量。)

回答帕特里克问题的更多信息:

新创建的 VAO 默认为空(据我所知)。根本没有几何图形,甚至没有顶点,所以如果你尝试绘制它,你会得到一个 OpenGL 错误。这是相当合理的,就像“将所有内容初始化为 False/NULL/0”一样。

你只需要glEnableClientState当你设置好东西时。 VAO 会记住每个指针的启用/禁用状态。

是的,VAO 将存储glEnableVertexAttribArray and glVertexAttrib。旧的 vertex, normal, color, ... 数组与属性数组相同,vertex == #0 等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是顶点数组对象? 的相关文章

  • QGLWidget 比 QWidget 慢

    问题主要是在标题中确定的 我尝试了 Qt 的示例 二维绘画 http harmattan dev nokia com docs library html qt4 opengl 2dpainting html 并注意到 如果我尝试在 QGLW
  • OpenGL C++ 鼠标光线拾取 glm:unproject

    我目前正在开发 C 游戏引擎 我想在应用程序中构建鼠标交互 我之前通过光线拾取完成了此操作 但当时我使用了固定的鼠标位置 现在我想不使用它 我读到您可以使用 glm unProject 函数来执行此操作 但我的函数不起作用 该函数给出的坐标
  • 无法将简单的无符号字节 RGB 纹理映射到四边形:

    我有一个非常简单的程序 将虚拟红色纹理映射到四边形 下面是 C 中的纹理定义 struct DummyRGB8Texture2d uint8 t data 3 4 int width int height DummyRGB8Texture2
  • 如何以编程方式在 qml 中渲染 vtk 项目?

    到目前为止 我了解到我们在 QML 中有两个线程 我们的主应用程序线程和我们的 场景图 线程 http doc qt io qt 5 qtquick visualcanvas scenegraph html http doc qt io q
  • 静态链接库时出现 glew 链接器错误

    我正在尝试在 Visual Studio 2012 中构建一个 opengl 项目 我想静态包含 glew 库 因此我从源代码构建它并将生成的 glew32sd lib 复制到我的 lib 目录 我将此 lib 路径提供给 Visual S
  • 从文件中读取 GLSL 着色器

    我正在尝试从如下所示的文件中读取顶点和片段着色器 version 330 core in vec3 ourColor out vec4 color void main color vec4 ourColor 1 0f but when i
  • 对 VBO 中的特定三角形使用不同的纹理

    我有 9 个由三角形组成的四边形 如下所示 我在用着VBO存储有关它们的数据 它们的位置和纹理坐标 我的问题是 是否可以仅使用一个来使四边形 5 具有与其余四边形不同的纹理VBO and shader 绿色代表纹理 1 黄色代表纹理 2 到
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • CPU 到 GPU 法线映射

    我正在创建一个地形网格 然后这个答案 https stackoverflow com a 5284527 1356106我正在尝试将 CPU 计算法线迁移到基于着色器的版本 以便通过降低网格分辨率并使用在片段着色器中计算的法线贴图来提高性能
  • glutPostRedisplay 不在循环内工作

    我试图让一个人在 y 轴上跳跃 所以我使用 2 秒的循环 第一秒它应该向下移动并弯曲膝盖 第二秒它应该向上移动 然后在起始位置完成 现在我刚刚开始让这个人在第一秒内跪下并弯曲膝盖 我还没有编写动画的其余部分 问题是 glutPostRedi
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • OpenGL z轴指向哪里?

    我正在尝试了解 OpenGL 坐标系 我到处都看到它被描述为右撇子 但这与我的经验不符 我尝试绘制一些形状和 3 d 对象 我发现 z 轴显然指向 屏幕 而 x 指向右侧 y 指向上方 这是左手坐标系的描述 我缺少什么 编辑 例如 http
  • 即使在顶点着色器中使用,glGetUniformLocation()也会返回-1

    我正在尝试用法线渲染一个简单的立方体 我使用以下代码来初始化着色器 void initShader const char vertexShaderPath const char fragmentShaderPath cout lt lt I
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi

随机推荐

  • Java 中的顺序无关哈希

    我想用Java计算一组字符串的哈希值 是的 我可以对字符串进行排序并计算 MD5哈希迭代使用digest update 但我宁愿省略排序并使用类似的东西combineUnordered https github com google gua
  • 使用 Python 计算 3D 图像的 Hessian 高斯特征值

    我有一个 3D 图像 我想计算该图像的 Hessian 或 Gaussian 特征值 我想要每个体素的 Hessian 近似的三个特征值 这个功能在图像处理中似乎很常见 是否有此功能的现有实现 例如用于拉普拉斯计算的 scipy ndima
  • 在 EC2 EBS 实例中更改 Cloudera 的 IP 地址

    我已经安装了clouderam1 large实例 我能够成功安装它 但是 一旦我停止实例并在第二天早上再次启动它 IP 就会发生变化 cloudera 仍然引用旧的 IP 并且没有任何服务运行 由于我无法全天保持实例运行 我该如何解决这个问
  • 仅解析包含字符串和值的 JSON 对象

    我在尝试解析最小值以在 Android 中进行映射时遇到问题 有一些示例 JSON 格式 其中包含更多信息 例如 id 1 name sql id 2 name android id 3 name mvc 这是最常用且易于使用的示例 只需使
  • ConcurrentHashmap 同时进行写入和获取操作

    我有一个关于 ConcurrentHashMap 的问题 假设我有 2 个线程 线程 A 尝试从共享 ConcurrentHashMap 中获取对象 线程B清除共享映射 如果线程 A 和线程 B 同时访问共享资源 会发生什么情况 我搜索了文
  • 从按下的按钮获取文本

    如何从按下的按钮获取文本 安卓 我可以从按钮获取文本 String buttonText button getText 我可以从按下的按钮获取 id int buttinID view getId 目前我不知道如何获取按下的按钮上的文本 p
  • 规划网络应用程序

    我即将开始建立新的初创公司 因此我需要您的一些指导 规划网站的最佳方法是什么 我不认为 首先设计 然后数据库关系 然后开始开发 而是 如何规划应用程序的工作方式 是否有一些经过验证的方法 例如制作网站 蓝图 的最佳方法 例如使用某种工具或其
  • Docker php:fpm—安装 php 扩展

    我用的是官方的php fpmdocker 镜像作为我的应用程序容器的基础 所以Dockerfile像这样开始 FROM php fpm 稍后在文件中我希望有类似的内容 RUN apt get install y php7 0 gd 但这告诉
  • 连续分数

    我对连续分数的理解是它总是以分数形式表示小数 我认为连续分数总是返回小于或等于小数的值 不幸的是 我的代码有时会返回大于十进制输入的小数值 我对连续分数的理解正确吗 如果是这样 请解释一下我的代码中的错误所在 public static R
  • JavaScript 获取样式

    是否可以使用 JavaScript 获取对象的所有样式 就像是 main css myLayer position absolute width 200px height 100px color 0000ff main js var ob
  • 在 ASP.NET MVC 5 中从 Facebook v2.4 API 访问 OAuthExternalLoginCallback 中的电子邮件地址[重复]

    这个问题在这里已经有答案了 对于 Facebook API v2 3 如果设置了以下内容 用户的电子邮件地址将在回调中返回ExternalLoginCallback app UseFacebookAuthentication new Fac
  • Apache Tomcat 8 不工作。抛出 HTTP 状态 500 - java.lang.ClassNotFoundException: org.apache.jsp.index_jsp

    我正在使用 Apache Tomcat 8 和 JDK 1 7 运行 startup bat 后 Tomcat 开始运行 但当我尝试跑步时 http localhost 8080 它显示一个错误 HTTP 状态 500 java lang
  • 提交到 Web 服务器的希伯来语字符串未收到希伯来语版本

    我从我的应用程序向网络服务器提交注册表单 EditText email EditText findViewById R id email EditText password EditText findViewById R id passwo
  • 使用 cin 检查空行

    我想检查是否有空行作为输入来执行特定操作 我尝试使用 cin peek 并检查它是否等于 n 但它没有意义 a b c 空行 在这里 我想执行我的操作 a 我试过这段代码 char a b c cin gt gt a cin gt gt b
  • MS Access 中的一对一关系

    我在 MS Access 中的两个表之间创建一对一关系时遇到问题 当我创建关系时 它默认为 多对一 并且我没有看到更改它的选项 有没有办法做到这一点 Access没有这样的概念 您可以将两个表合并为一个表 也可以在两个表上为公共字段放置唯一
  • Tomcat 访问日志中的 HTTP 状态代码 500 ClientAbortException / 管道损坏

    我们使用 Kibana 设置了一些仪表板和可视化 以监控 tomcat 为 Spring Boot Web 应用程序生成的访问日志 我们特别关注状态代码为 5xx 的请求 事实证明 如果客户端请求资源 并且在请求正在进行时取消该请求 使用C
  • 在 vb.net 中关闭数据读取器的正确点

    我在 vb net 中有这段代码 reader myCommand ExecuteReader If reader HasRows Then While reader read End While End If 我应该在之后使用 reade
  • 闪亮:动态更改选项卡名称

    我正在开发一个应该处理多种语言的闪亮应用程序 我设法动态翻译应用程序的几乎所有元素 具体取决于selectInput选择语言 然而 困难的事情 仍然是navbarPage选项卡以及tabPanels在我的页面内 我不能改变他们的名字 我尝试
  • 美丽的汤和表抓取 - lxml 与 html 解析器

    我正在尝试使用 BeautifulSoup 从网页中提取表格的 HTML 代码 table class facts label table 我想知道为什么下面的代码适用于 html parser 并打印回来none如果我改变 html pa
  • 什么是顶点数组对象?

    我今天刚刚开始从本教程学习 OpenGL http openglbook com the book http openglbook com the book 我读到了第二章 画了一个三角形 除了 VAO 这个缩写可以吗 之外 我理解了所有内