经过一些搜索后,据说分离的VAOs共享完全相同的着色器属性布局,将它们合并到一个VAO中,并将所有这些数据放到一个VBO中,这样我就可以只使用一个绘制调用就可以绘制这个对象。
这很有道理,但是统一变量又如何呢?说我想画树和球。它们有不同的顶点计数,有不同的转换,但共享完全相同的着色程序。
直到现在,我的节目就像
// 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的顶点,比如:
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?还是我的做法完全错了?
发布于 2021-06-19 06:13:54
分批的目的是通过最小化绘制调用之间的状态变化来提高性能(批处理将它们减少到0,因为在绘制调用之间没有任何变化)。但是,性能也有不同程度的提高,而且并非所有的状态更改都是相同的。
在州变化的成本的规模上,更换程序制服是最便宜的状态变化。这并不是说这是毫无意义的,但你应该考虑与你从中得到的结果相比,你真正想要花费多少精力。尤其是如果你没有尽可能快地推进硬件。
VAO更改(非仅缓冲区更改,即)是比较昂贵的状态更改,因此您通过消除它们获得了很多好处。
顾名思义,uniform
变量不能在抽签调用中从一个着色器实例更改为另一个。甚至是一个多平局的电话。但这并不意味着什么都做不了。
多绘图功能允许您在一个函数调用中发出多个绘制调用。这些单独的绘图可以从顶点和索引缓冲区的不同部分获取它们的顶点数据。您需要的是一种与您的顶点着色器通信的方式,它可以参与绘制调用,这样它就可以索引一个数组来提取绘制调用的每个对象的数据。
半近现代硬件gl_DrawID
,它是对正在执行的特定绘图调用的多绘图命令的索引。ARB_shader_draw_parameters扩展是相当广泛地实施。您可以使用该索引从UBO或SSBO中获取每个对象的数据。
https://stackoverflow.com/questions/68044643
复制相似问题