首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将两个不同的网格放置在同一个顶点VBO的OpenGL最佳实践

将两个不同的网格放置在同一个顶点VBO的OpenGL最佳实践
EN

Stack Overflow用户
提问于 2021-06-18 23:37:15
回答 1查看 311关注 0票数 2

经过一些搜索后,据说分离的VAOs共享完全相同的着色器属性布局,将它们合并到一个VAO中,并将所有这些数据放到一个VBO中,这样我就可以只使用一个绘制调用就可以绘制这个对象。

这很有道理,但是统一变量又如何呢?说我想画树和球。它们有不同的顶点计数,有不同的转换,但共享完全相同的着色程序。

直到现在,我的节目就像

代码语言:javascript
运行
AI代码解释
复制
// generate VAOs, called only once

glGenVertexArray(1, &treeVaoId);
// generate VBO and bind tree vertices
// enabled vertex attribute and set it for shader program

glGenVertexArray(1, &ballVaoId);
// repeat for ball


// draw, called each frame

// give the tree's transform to shader as uniform
glDrawArrays(...) // first draw call

// repeat for ball
glDrawArrays(...) // second draw call

对于一个VAO和VBO的顶点,比如:

代码语言:javascript
运行
AI代码解释
复制
glGenVertexArray(1, &treeBallId);
// generate enough size of VBO and bind tree vertices and ball vertices after it.
// enabled vertex attribute and set it for shader program

// to draw, I have to separately give transform to it's uniform to each tree and ball, but how?
glDrawArrays(...)

对不起,可怜的例子,但重点是,有没有办法给出不同的均匀变量,同时绘制一个VAO?还是我的做法完全错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-19 06:13:54

分批的目的是通过最小化绘制调用之间的状态变化来提高性能(批处理将它们减少到0,因为在绘制调用之间没有任何变化)。但是,性能也有不同程度的提高,而且并非所有的状态更改都是相同的。

州变化的成本的规模上,更换程序制服是最便宜的状态变化。这并不是说这是毫无意义的,但你应该考虑与你从中得到的结果相比,你真正想要花费多少精力。尤其是如果你没有尽可能快地推进硬件。

VAO更改(非仅缓冲区更改,即)是比较昂贵的状态更改,因此您通过消除它们获得了很多好处。

顾名思义,uniform变量不能在抽签调用中从一个着色器实例更改为另一个。甚至是一个多平局的电话。但这并不意味着什么都做不了。

多绘图功能允许您在一个函数调用中发出多个绘制调用。这些单独的绘图可以从顶点和索引缓冲区的不同部分获取它们的顶点数据。您需要的是一种与您的顶点着色器通信的方式,它可以参与绘制调用,这样它就可以索引一个数组来提取绘制调用的每个对象的数据。

半近现代硬件gl_DrawID,它是对正在执行的特定绘图调用的多绘图命令的索引。ARB_shader_draw_parameters扩展是相当广泛地实施。您可以使用该索引从UBO或SSBO中获取每个对象的数据。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68044643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文