- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我有一个顶点不断变化的模型,因此我需要在每一帧上重新绑定(bind) VBO 上的所有信息,使用即时模式是否会提高性能?或者,所有数据同时传递到 GFX 卡的事实仍然是 VBO 的救赎因素吗?
根据第一个问题的答案,这是否意味着为每个网格保留一个世界矩阵比简单地平移几何体并重新创建 VBO 更好?
最佳答案
与几乎所有性能问题一样,答案是:这取决于情况。许多因素都会发挥作用,主要是您的确切使用模式以及 OpenGL 实现的特征。
虽然立即模式在很大程度上被认为已经过时,并且已从现代 OpenGL 版本中删除,但如果您的几何图形高度动态,则使用 VBO 获得更好的性能可能会非常困难。
作为一个案例研究,我已经在一个爱好项目 (1) 上工作了相当长的时间(并且有很长的休息时间)。在这种情况下,所有顶点坐标都是动态计算的,并且仅用于渲染一次。最初的版本使用立即模式,因为它对于这种情况很方便,而且当我编写它时,立即模式还没有那么过时。几年后,当我再次拿起它并将其移植到 Core Profile 和 ES 3.0 时,我最初很难获得同等的性能。
您必须尝试各种选项才能找到最适合您的用例和平台的选项。常见选项包括:
glBufferSubData()
批量将其输入 VBO。glBufferData()
创建一个足够大以容纳数据的 VBO。然后使用 glMapBuffer()
或 glMapBufferRange()
映射缓冲区内存,并将顶点数据写入映射的内存。关于立即模式如何在当前 GPU 上工作,存在一个常见的误解(部分反射(reflect)在其他答案中)。目前没有 GPU(据我所知)实际上支持立即模式。当您进行立即模式调用时,驱动程序通常会将顶点数据放入缓冲区中,并稍后将这些缓冲区提交给 GPU。所以 GPU 最终会执行几乎相同的绘图。唯一的区别是您是否构建缓冲区(通过使用基于 VBO 的绘图),或者是否让驱动程序处理它(通过使用立即模式)。
立即模式绘制通常效率低下的主要原因是它需要如此多的 API 调用,而不是因为 GPU 最终执行的内容。
(1) 无耻的插件,如果有人想看看它是什么:http://retokoradi.com/volume-rendering/ .
关于opengl - VBO 与立即模式性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077407/
目前,在我的渲染引擎中,每个网格数据都有一个 VBO(1 个 VBO 用于顶点,1 个 VBO 用于法线,1 个 VBO 用于纹理坐标,1 个 VBO 用于切线,1 个 VBO 用于副切线)并且它们都
我有一个代码,最初有一个着色器 (ourShader)、一个 VAO 和一个 VBO。它将使用 Stencil 测试渲染带有纹理立方体的场景及其在地面上的反射。现在,我想为后处理添加一个帧缓冲区,所以
因此,我使用两个 VBO 成功绘制了一系列线条,一个用于顶点,一个用于索引。 Python 列表是: vertices = [ [0,1],[0,2],[0,3], # Axe
因此,我需要使用一次绘制调用来渲染多个对象(而非实例)的方法。实际上我知道如何做到这一点,只是将数据放入单个 vbo/ibo 并使用 glDrawElements 进行渲染。 问题是:使用 glUni
大家好。我正在尝试呈现如下所示的两种方法。 RenderA() 使用的是 VBO 而 RenderB() 不是。当它到达 RenderB() 中的 glDrawArrays() 时,我收到一个 EXC
我正在尝试制作一个类似于《我的世界》的 opengl 体素引擎。 我创建了一个 block 类,我想将整个 block 的所有顶点放入单个 VBO 中。我之前只是将每个 block 放入 vbo 中并
我最近将当前项目中的绘图从内存阵列的标准绘图更改为 VBO。令我惊讶的是,帧速率从 60fps 显着下降到 30fps,绘制了 1200verts 的模型 8 次。进一步的分析表明,与从内存中绘制相比
所以我了解如何使用顶点缓冲区对象,并且它比立即模式绘图提供了很大的性能提升。我将绘制很多 2D 四边形( Sprite ),我想知道我是否应该为每个四边形创建一个 VBO,或者创建一个 VBO 来保存
我正在编写一个在 OpenGL 中渲染一些网格的插件。 我在一个 VBO 中有一个 Vertices 数组,在另一个 VBO 中有一个 Indices 数组。我现在想存储法线。由于多个面之间共享的顶点
你能渲染一个由四边形组成的 VBO,每个四边形都具有不同的纹理吗?现在,我读到了有关按纹理或纹理图集排序的内容,但这仍然不能回答我的问题。我正在开发一款 2d 游戏。现在我的动画 Sprite 将拥有
我有一个 2D VBO 对象,它表示 2D 空间中的点。此时绘制任意形状的最佳方法是什么?假设我想在每个位置画一个红色的“X”。 我可以使用着色器来做到这一点吗? 最佳答案 您不一定需要特殊的着色器,
如果我有一个顶点不断变化的模型,因此我需要在每一帧上重新绑定(bind) VBO 上的所有信息,使用即时模式是否会提高性能?或者,所有数据同时传递到 GFX 卡的事实仍然是 VBO 的救赎因素吗? 根
我想在交错的 OpenGL vbo 中存储三个浮点值和两个字节值。不幸的是,渲染的数据显然不正确。当我使用两个不同的 VBO 渲染相同的数据时,一切都工作正常,因此我不认为我的着色器存在问题。 /*
此代码工作正常,呈现正确(没有发布所有相关代码,因为我认为这些部分有问题): std::vector vboId; std::vector > verts; ...初始化: verts[num].pu
现在我正在使用索引,所以我在让我的 VBO 正确渲染法线时遇到了一些麻烦。我很确定我对普通指针的偏移有问题,但数学似乎加起来对我来说是正确的。 我如何存储数据: struct MyVertex {
我正在尝试使用 OpenGL 中的顶点缓冲区对象绘制两个四边形。他们应该用不同的颜色绘制。如您所见,第一个四边形具有红色、绿色、蓝色和黄色顶点。第二个四边形有不同的颜色,但问题是第二个四边形被完全绘制
我正在尝试在我的原生黑莓 10 应用程序中使用 VBO 绘制一个正方形。我的实现是, glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
在我的项目中,我想使用 vbo 显示许多对象(球体)。我设法毫无问题地显示 1 个对象,但是当涉及到 2 个或更多对象时,所有对象 (vbos) 都被最后定义的对象 (vbo) 替换。 CosmicB
我已经学习 VBO 几个星期了,有人告诉我 here VBO 可以渲染“约 100 万个顶点,每秒数百帧”。然而,我当前的 VBO 测试程序只能获得大约 50 FPS 的渲染速度和 100 万个顶点。
我正在使用 Haskell 制作一个渲染引擎,并且正在优化我的代码以使用 VBO。我想稍微抽象一下几何类型,因为有相当数量,并且想把它放在一个函数和一些参数中。 例如,如果我有一组几何体,它是一对顶点
我是一名优秀的程序员,十分优秀!