问题标签 [geometry-instancing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - OpenGL glDrawArraysInstanced 比 glDrawElementsInstanced 更快:有没有办法让 glDrawElementsInstanced 更快?
我正在使用 OpenGL 实例化方法进行测试,并测试了 glDrawArraysInstanced 和 glDrawElementsInstanced 函数,其余代码几乎相同。测试是渲染 100 万个可以旋转和平移的彩色方块(缩放为像素并适合屏幕),并查看 FPS 差异。我得到的结果是:
- 使用 glDrawArraysInstanced:36-39 FPS
- 使用 glDrawElementsInstanced:24-28 FPS
根据我的研究,我没有关于哪个函数应该更快的结论,不过我更喜欢使用 glDrawElementsInstanced。
所以我的问题是,在这种情况下(或一般情况下)是否有改进 glDrawElementsInstanced 的方法,以便用它进行绘图与 glDrawArraysInstanced 相同或更快。这是我用于 glDrawArraysInstanced 的代码:
以及使用 glDrawElementsInstanced 的代码(几乎相同,但带有索引):
顶点着色器代码(如果有帮助):
提前致谢。
更新: 好的,看来我有一个与此无关的问题。我在另一台机器上测试了这两个代码,结果让我感到惊讶。首先是一些背景:上面的测试是在这个(PC)设置上进行的:16GB ram,i7 4790k,GTX 970。
然后我用这个设置在我的笔记本电脑上做了同样的测试:8GB ram、i5 8250u、Geforce MX150 (2GB)
结果:
- 使用 glDrawArraysInstanced:73-87 FPS
- 使用 glDrawElementsInstanced:74-87 FPS
我还注意到,在我的笔记本电脑中,GPU 使用率一直在 99% 左右,而在我的 PC 中,使用 glDrawElementsInstanced 和 glDrawArraysInstanced 大约 45% 和 60% 左右摆动。在这两种情况下,所有内核的 CPU 使用率都低于 60%(因此 CPU 瓶颈是毫无疑问的)。我尝试卸载 GPU 驱动程序并使用 DDU 重新安装,但没有成功。我还检查了两个系统中的 Nvidia 控制面板,设置完全相同。我在两台机器上都安装了 Windows 10,并且它们在 Windows 控制面板上设置为最高性能。我最初的问题得到了部分回答,因为我在不同的机器上有非常不同的 FPS 结果(在绘制调用函数本身之间)。怎么可能有这样的差异?欢迎任何建议。
three.js - A-Frame:几何缓存/从 GLTF 注册新几何
我希望通过 A-Frame 使用几何实例化获得一些帮助。我试图找出我的网络应用程序的瓶颈,在为场景中创建的物理对象实现池化之后,看到绘制调用的数量随着每个新对象的增加而增加——我曾认为通过利用资产管理系统在 A-Frame 我的模型被自动缓存,但我想我错了。
我想知道,如果我使用 注册模型的几何图形AFRAME.registerGeometry
,我可以利用几何实例化吗?我看到使用 A-Frame 几何图元从对象池创建并没有增加每个实体的场景几何数。我尝试加载我的 GLTF 并从网格中注册几何图形,但是我从 a-node 收到一个我不理解的错误:
错误:
对此的任何帮助将不胜感激!谢谢
javascript - 使用实例化,我无法更改单个子几何图形的透明度/不透明度
我有一个由 1000 个球体实例组成的简单模型。我正在尝试使用实例化来减少绘图调用的数量。但是,我无法更改单个子几何图形的透明度/不透明度。
我已经尝试过以下事情:
我可以使用改变每个球体的透明度
但是,这会将每个球体的不透明度更改为 0.2。
html文件是这样的:
实现实例化的功能:
谁能告诉我,如何只改变一个球体的不透明度?先感谢您!
另外,假设我正在尝试复制多个盒子。其中之一如下:
我将填写 translateArray 和 vectorArray 的值是多少?提前非常感谢!
c++ - 使用 glDrawElementsInstanced 进行实例渲染时的行为不一致,有时没有渲染且没有错误
我一直在使用 OpenGL 进行项目。使用实例化绘制调用渲染粒子。
问题是有时 glDrawElementsInstanced 不会渲染任何东西。并且没有错误报告。其他模型和效果渲染良好。但是我的粒子系统中没有粒子会渲染。绘图调用看起来像
ec
是一个用于e
rror c
heck opengl 的宏。它有效地做到了这一点:
渲染粒子的问题在发布模式下更为普遍,而不是调试模式;但在两种模式下都会发生。该问题发生8/10
在发布模式和1/10
调试模式下。
下面是粒子的渲染过程:对于每个实例化的drawcall...
- 绑定共享顶点缓冲区对象(vbo)
- 将数据放入该顶点缓冲区对象(vbo)
- 遍历许多顶点数组对象(vao),将 VBO 与它们关联并设置顶点属性
- 渲染每个 vao
所有对象共享相同的 VBO,但按顺序呈现。整个应用程序当前是单线程的,所以这应该不是问题。
粒子 A(两个 vao)和 B(一个 vao)的给定框架如下:
- -将 A 的数据缓冲到名为 VBO 的顶点缓冲区中
- -绑定 A_vao1
- -设置A的实例顶点属性
- -绑定 A_vao2
- -设置A的实例顶点属性
- -渲染 A_vao1
- -渲染 A_vao2
- -缓冲区 B 的数据到顶点缓冲区名称 VBO(没有 glGenBuffers,这是同一个缓冲区)
- -绑定 B_vao1
- -设置B的实例顶点属性
- -渲染 B_vao1
这种方法有明显的问题吗?
下面的源代码已被简化,但我留下了大部分相关部分。与我上面的不同,它实际上使用了 2 个共享顶点缓冲区对象 (VBO),一个用于 matrix4s,一个用于 vector4s。
这种可见性有什么问题吗?我已经调试过RenderDoc
,当问题不存在时,事件浏览器中会出现一个绘图调用,如下图所示:
但是当问题确实发生时,绘图调用根本不会出现RenderDoc
如下图所示:
这对我来说似乎很奇怪。我已经用调试器验证了绘图调用正在执行。但它似乎默默地失败了。
我尝试使用 nvidia nsight 进行调试,但通过 nvidia nsight 启动时无法重现它。
我已验证
- 实例 VBO 缓冲区大小不会改变或增长太大,它的大小是稳定的
- 制服是正确地找到价值
- vao 绑定似乎以正确的顺序发生
系统规格:Windows 10;Opengl3.3,8gb内存;i7-8700k,NVIDIA GeForce GTX TITAN X
在我的笔记本电脑上也观察到问题,再现率大致相同。它有一个英特尔图形芯片。
github 链接到实际源代码,如果有人尝试编译,请告诉我,您需要将隐藏的 .suo 替换为我制作的副本以自动填写链接器设置。功能:ParticleSystem::handlePostRender
performance - 在 Three.js 中高效渲染数万个大小/颜色/位置可变的球体?
这个问题是从我最后一个问题中得到的,我发现使用 Points 会导致问题:https ://stackoverflow.com/a/60306638/4749956
要解决这个问题,您需要使用四边形而不是点来绘制点。有很多方法可以做到这一点。将每个四边形绘制为单独的网格或精灵,或者将所有四边形合并到另一个网格中,或者在每个点都需要一个矩阵的地方使用 InstancedMesh,或者编写自定义着色器来做点(参见本文的最后一个示例)
我一直在试图弄清楚这个答案。我的问题是
什么是“实例化”?合并几何和实例化有什么区别?而且,如果我要执行其中任何一项,我会使用什么几何图形以及如何改变颜色?我一直在看这个例子:
https://github.com/mrdoob/three.js/blob/master/examples/webgl_instancing_performance.html
而且我看到对于每个球体,您都会有一个几何图形来应用位置和大小(比例?)。那么,底层几何图形会是单位半径的 SphereBufferGeometry 吗?但是,你如何应用颜色?
另外,我读到了自定义着色器方法,它有一些模糊的意义。但是,它似乎更复杂。性能会比上面的更好吗?
c++ - 使用顶点缓冲区实例化,如何动态改变单独的实例位置?
我需要画一百万个立方体。立方体具有相同的顶点数组,但可能具有不同的比例/位置/旋转。重要提示:在创建顶点缓冲区后,它们可能会动态更改其位置。其中一些应该通过线路连接。所以我还需要画线。
目前我使用常量缓冲区处理实例化:
顶点着色器.hlsl
在 D3D 初始化中,我创建了一个常量缓冲区资源,获取 GPU 地址并在那里复制结构对象:
然后我填写cbNPerObject.world
我需要的方式,并用我添加的多维数据集UpdatePipeline()
进行一次调用。DrawIndexedInstanced()
一切都很好,除了一件事 - 恒定的缓冲区大小限制。float4x4 world[4000]
可以是 maxim 4096 大小,但我需要数百万。以 4096 大小的常量缓冲区的形式创建块 - 似乎并不酷。所以我决定使用另一种实例化方法——使用顶点缓冲区。
我不明白如何在使用顶点缓冲区时动态转换我的实例,因为要更改顶点缓冲区,我必须更改vertexBufferView
这似乎也不正确。据我了解以这种方式进行实例化,我需要创建实例缓冲区并将其与顶点缓冲区或什么一起存储,我很困惑
c++ - 如何让实例化在我的 OpenGL 程序中工作?
我为我的立方体创建了一个顶点数组。我正在尝试创建 1000 个立方体形状的立方体。我相信我不明白何时生成和绑定 VAO 和 VBO。我不知道什么信息可以帮助解决这个问题。在 pastebin 中,我首先包含了着色器,然后是主代码。什么都没有出现,但它正在运行。
编辑:立方体在第 100 行
编辑 2:实例化代码从 160 开始
编辑 3:显示矩阵从 272 开始
编辑 4:draw call 从 293 开始
c++ - Qt3D - 2 个正方形的实例渲染。原始类型?实例计数?
我想使用实例渲染在屏幕上显示 2 个方块。
问题是:
当我画 2 个正方形时,它们是相连的。我无法绘制多个单独的正方形。
我知道它与 PrimitiveType 有关:我正在使用Qt3DRender::QGeometryRenderer::LineLoop或Qt3DRender::QGeometryRenderer::TriangleFan但有没有办法告诉 Qt 在多个实例中分离我的数据缓冲区?以便 PrimitiveType 应用于每个实例而不是所有顶点。
我有一个创建形状的函数:
当我调用这个函数时,我把我的 2 个方块放在 listVertices 变量中。这样我的所有方块都显示在一个绘图调用中。
但形状是一种或另一种连接方式。有没有办法删除它?我没有使用InstanceCount或Divisor,但我不知道它是如何工作的。我用它做了一些测试,但没有任何效果
opengl - OpenGL 实例化绘图是否有定义的绘制顺序?
我想使用 OpenGL 实例化绘制大量重叠的、不透明的对象。为了降低填充率,我想从靠近相机到远离它进行排序。如果我按照我希望绘制的顺序对缓冲区中的值进行排序,标准是否规定 OpenGL 必须按该顺序绘制它们?如果要并行或以未指定的顺序绘制缓冲区,那么对缓冲区进行排序将是一种巨大的计算浪费。