- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的代码正常工作,但这可能是巧合,我不想稍后再讨论错误,所以我尽量保持它的整洁:
我执行以下操作来初始化网格:
根据我的理解,VAO 将存储我启用的顶点属性数组的状态。它还将存储我绑定(bind)的 VBO 和 IBO。由于我通过将顶点数组绑定(bind)回 0 来“关闭”了 VAO 上的所有操作,因此我确保没有其他代码会弄乱我的 VAO。所以如果这没问题,我需要渲染的是:
这应该会带来 AttribArray 状态以及存储的 VBO 和 IBO。我的问题是:
A. 设置 VertexAttribPointers 后是否需要绑定(bind) IBO?如果是,为什么?
B. VAO 是否真的存储VBO 和IBO?我听说它只存储绑定(bind)的 last 缓冲区,这意味着我必须像这样呈现:
但这是没有意义的,当它们不存储两个缓冲区对象时为什么要使用 VAO?这不就和绑定(bind) VBO 和 IBO,然后在不绑定(bind) VAO 的情况下绘制元素一样吗?
预先感谢您的帮助。
代码如下:
初始化
// generate VBO
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, m_vertices.size()*sizeof(GLfloat), m_vertices.data(), GL_STATIC_DRAW);
// generate IBO
glGenBuffers(1, &m_ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size()*sizeof(unsigned short), m_indices.data(), GL_STATIC_DRAW);
// generate VAO
glGenVertexArrays(1, &m_vao);
glBindVertexArray(m_vao);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
// set the vertex attribute pointer
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,vertexSize,reinterpret_cast<const GLvoid*>(0));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBindVertexArray(0);
绘图
glBindVertexArray(m_vao);
glDrawElements(GL_TRIANGLES,size,GL_UNSIGNED_SHORT,reinterpret_cast<const GLvoid*>(0));
glBindVertexArray(0);
还有,如果我这样写是不是更干净了:
看起来更干净了,但我不知道结果是否相同,特别是因为第 4 步和第 5 步之间缺少 IBO 绑定(bind)。
最佳答案
解决您的问题:
A. Do I need to bind the IBO after I set the VertexAttribPointers? If so, why?
没有。您可以先绑定(bind)元素数组(在您的术语中为 IBO),然后再绑定(bind)顶点属性,但一般来说,它们在 VAO 中是单独的绑定(bind)。例如,您可以绑定(bind) IBO 以及多个 VBO,并使用 IBO 中的数据使用 glDrawElements
(和变体)或使用 glDrawArrays
(和变体)进行渲染) 仅使用 VBO 中的顺序顶点数据 - 渲染命令决定是否使用 IBO。
B. Does the VAO really store both the VBO and the IBO?
是的。一个VAO可以存储单个IBO和至少16个VBO的绑定(bind)信息。
I've heard it only stores the last buffer that was bound, meaning I have to render like this:
Bind VAO
Bind VBO
Draw Elements
Unbind VAO
正如您在原始帖子中推测的那样,此声明是不正确的,并且您包含的 VBO 的绑定(bind)是不必要的。一个 VAO 可以存储依赖于实现的最大(至少为 16)数量的 VBO,每个 VBO 都可以绑定(bind)到一个顶点属性。
Also, isn't it cleaner if I put it like this:
- Gen and bind VAO
- Gen and bind IBO and BufferData
- Gen and bind VBO and BufferData
- EnableVertexAttribArrays that I need and set VertexAttribPointers
- Unbind VAO (binding to 0)
是的。正如您所指出的,这允许您仅使用三个命令进行绑定(bind)、渲染和清理。
真的,这就是 VAO 的全部要点,收集所有这些绑定(bind)和顶点属性关联,这样您就可以一次完成所有管道,然后稍后即发即弃。
关于c++ - VAO 是否同时记住 EBO/IBO(元素或索引)和 VBO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332657/
我观察到很少有逆向工程师,他们将十进制转换为十六进制的速度如此之快。这简直太神奇了。我一直没有机会问他们。就我个人而言,我真的很讨厌这个转换,而且我总是使用计算器进行转换。 我想知道这种转换是否有某种
我有一个程序使用三个 JTextField 字段作为主要数据输入字段。我想要它,以便当用户终止程序然后再次打开它时,他们的最后一个条目仍将在字段中。 我怎样才能做到这一点?我需要某种数据库还是有更简单
我有以下脚本将 jquery 生成的对象的颜色更改为蓝色: $(".objects_list").live('click', function(event) { $(this).css("co
这个问题在这里已经有了答案: Is it a good idea to memoize all of my react components? (2 个答案) 关闭去年。 我知道使用 React.m
我在 R 中编写了一个递归函数并使用 memoise 来加速它。我试图通过在 Rcpp 中编写它然后记住 Rcpp 函数来进一步加快它的速度,但 R 函数更快。为什么会这样,有什么方法可以加快我的使用
我的应用程序包含几个 View ,我想在应用程序启动且用户尚未完成向导时显示一个小设置。我知道我可以使用 NSUserDefaults 实现此目的,但我不确定如何使其根据 NSUserDefaults
我正在从一台机器(相同版本的Delphi)开发应用程序。该应用程序的原始版本使用了TMS包中的TMoneyEdit组件。在移动项目时,我想删除对该产品的依赖。因此,在源代码中,我删除了TMoneyEd
我有一个触发器,希望将相同的随机值插入两个表中。我该怎么做呢? 在TableAB上插入后创建触发器insertTrigger 开始 插入TableA(id,num)VALUES(RANDOM(),1)
我有以下代码,通过 .swf 解决方案将服务器 IP 复制到客户端的剪贴板。正如您所看到的,它用成功的“已复制”消息替换了“复制 IP”按钮。我该如何让“复制 IP”按钮在显示成功消息 5 秒后返回,
我正在使用 GPS 定位功能,问题是权限弹出窗口一遍又一遍地出现(每次新的网址刷新/按 F5 键)。 我如何记住用户在浏览器中选择的状态(已批准或已拒绝)。 if (navigator.geoloca
有一个按钮(实际上有很多),它有一个事件处理程序: el.onclick = function(){ if(this.className.indexOf("minimized") != -1)
我正在制作一个纯 html+JavaScript 幻灯片。幻灯片位于网站的侧边栏中,该网站为每个具有幻灯片侧边栏的页面加载了 php。唯一没有侧边栏的页面是主页。 幻灯片放映工作正常。然而,可以理解的
我想制作一个 Chrome 扩展程序,它将存储来自用户的潜在大型代码片段(以及代码片段的名称)并使用它们。 我希望用户能够上传包含这些片段的文件(或者更好的是,将这些片段复制并粘贴到扩展程序选项页面的
我有一个方法是 pure function并需要一段时间才能运行。我想记住这个方法,以便后续调用更快。我可以在 Groovy 的文档中看到,您可以通过以下方式内存闭包: foo = {…}.memoi
[jQuery][1] 始终记住您的鼠标触发器,无论是单击还是悬停。因此,如果您鼠标输入和鼠标退出四次,它将执行该事件四次。 如何让它“忘记”触发器,以便当我用鼠标输入和退出触发器时它只执行一次? 编
对于我的开发人员工作,我几乎整天都在 *nix shell 环境中工作,但似乎仍然无法记住我每天不使用的程序的名称和参数细节。我想知道其他“临时健忘症患者”是如何处理这个问题的。你有一个大的备忘单吗?
我有一个表格,在客户填写各种表格后,我希望能够浏览网站,并返回表格并保持填写状态。 我考虑过在浏览器的客户端中保留 cookie,您可能会推荐其他方法吗? 关于代码,这里是 o 想到的 javascr
好的,我已经实现了 Facebook 登录按钮: loginButton.readPermissions = ["public_profile", "email", "user_friends"] l
我在移动应用程序中使用 AngularJS。用户能够将产品添加到订单中。但是我使用了不同的选项卡,以便用户可以在类别之间切换,并且对于每个类别,都会显示属于该类别的产品。这些产品可以添加到他/她的订单
我有一个使用自定义适配器、布局和模型类的 ListView (包含文本和复选框)。我想将选定的复选框保存在 sqlite 数据库中,以便当我导航到另一个 Activity 然后返回时,选定的复选框保持
我是一名优秀的程序员,十分优秀!