问题标签 [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.

0 投票
0 回答
452 浏览

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 结果(在绘制调用函数本身之间)。怎么可能有这样的差异?欢迎任何建议。

0 投票
1 回答
192 浏览

three.js - A-Frame:几何缓存/从 GLTF 注册新几何

我希望通过 A-Frame 使用几何实例化获得一些帮助。我试图找出我的网络应用程序的瓶颈,在为场景中创建的物理对象实现池化之后,看到绘制调用的数量随着每个新对象的增加而增加——我曾认为通过利用资产管理系统在 A-Frame 我的模型被自动缓存,但我想我错了。

我想知道,如果我使用 注册模型的几何图形AFRAME.registerGeometry,我可以利用几何实例化吗?我看到使用 A-Frame 几何图元从对象池创建并没有增加每个实体的场景几何数。我尝试加载我的 GLTF 并从网格中注册几何图形,但是我从 a-node 收到一个我不理解的错误:

错误:

对此的任何帮助将不胜感激!谢谢

0 投票
1 回答
532 浏览

javascript - 使用实例化,我无法更改单个子几何图形的透明度/不透明度

我有一个由 1000 个球体实例组成的简单模型。我正在尝试使用实例化来减少绘图调用的数量。但是,我无法更改单个子几何图形的透明度/不透明度。

我已经尝试过以下事情:

我可以使用改变每个球体的透明度

但是,这会将每个球体的不透明度更改为 0.2。

html文件是这样的:

实现实例化的功能:

谁能告诉我,如何只改变一个球体的不透明度?先感谢您!

另外,假设我正在尝试复制多个盒子。其中之一如下:

我将填写 translateArray 和 vectorArray 的值是多少?提前非常感谢!

0 投票
1 回答
162 浏览

c++ - 使用 glDrawElementsInstanced 进行实例渲染时的行为不一致,有时没有渲染且没有错误

我一直在使用 OpenGL 进行项目。使用实例化绘制调用渲染粒子。 在此处输入图像描述

问题是有时 glDrawElementsInstanced 不会渲染任何东西。并且没有错误报告。其他模型和效果渲染良好。但是我的粒子系统中没有粒子会渲染。绘图调用看起来像

ec是一个用于error check opengl 的宏。它有效地做到了这一点:

渲染粒子的问题在发布模式下更为普遍,而不是调试模式;但在两种模式下都会发生。该问题发生8/10在发布模式和1/10调试模式下。

下面是粒子的渲染过程:对于每个实例化的drawcall...

  1. 绑定共享顶点缓冲区对象(vbo)
  2. 将数据放入该顶点缓冲区对象(vbo)
  3. 遍历许多顶点数组对象(vao),将 VBO 与它们关联并设置顶点属性
  4. 渲染每个 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

0 投票
2 回答
607 浏览

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 吗?但是,你如何应用颜色?

另外,我读到了自定义着色器方法,它有一些模糊的意义。但是,它似乎更复杂。性能会比上面的更好吗?

0 投票
1 回答
1000 浏览

c++ - 使用顶点缓冲区实例化,如何动态改变单独的实例位置?

我需要画一百万个立方体。立方体具有相同的顶点数组,但可能具有不同的比例/位置/旋转。重要提示:在创建顶点缓冲区后,它们可能会动态更改其位置。其中一些应该通过线路连接。所以我还需要画线。

目前我使用常量缓冲区处理实例化:

顶点着色器.hlsl

在 D3D 初始化中,我创建了一个常量缓冲区资源,获取 GPU 地址并在那里复制结构对象:

然后我填写cbNPerObject.world我需要的方式,并用我添加的多维数据集UpdatePipeline()进行一次调用。DrawIndexedInstanced()

一切都很好,除了一件事 - 恒定的缓冲区大小限制。float4x4 world[4000]可以是 maxim 4096 大小,但我需要数百万。以 4096 大小的常量缓冲区的形式创建块 - 似乎并不酷。所以我决定使用另一种实例化方法——使用顶点缓冲区。

我不明白如何在使用顶点缓冲区时动态转换我的实例,因为要更改顶点缓冲区,我必须更改vertexBufferView这似乎也不正确。据我了解以这种方式进行实例化,我需要创建实例缓冲区并将其与顶点缓冲区或什么一起存储,我很困惑

0 投票
1 回答
88 浏览

c++ - 如何让实例化在我的 OpenGL 程序中工作?

https://pastebin.com/Dyv5JBFd

我为我的立方体创建了一个顶点数组。我正在尝试创建 1000 个立方体形状的立方体。我相信我不明白何时生成和绑定 VAO 和 VBO。我不知道什么信息可以帮助解决这个问题。在 pastebin 中,我首先包含了着色器,然后是主代码。什么都没有出现,但它正在运行。

编辑:立方体在第 100 行

编辑 2:实例化代码从 160 开始

编辑 3:显示矩阵从 272 开始

编辑 4:draw call 从 293 开始

0 投票
1 回答
353 浏览

c++ - Qt3D - 2 个正方形的实例渲染。原始类型?实例计数?

我想使用实例渲染在屏幕上显示 2 个方块。

问题是:
当我画 2 个正方形时,它们是相连的。我无法绘制多个单独的正方形。

我知道它与 PrimitiveType 有关:我正在使用Qt3DRender::QGeometryRenderer::LineLoopQt3DRender::QGeometryRenderer::TriangleFan但有没有办法告诉 Qt 在多个实例中分离我的数据缓冲区?以便 PrimitiveType 应用于每个实例而不是所有顶点。

我有一个创建形状的函数:

当我调用这个函数时,我把我的 2 个方块放在 listVertices 变量中。这样我的所有方块都显示在一个绘图调用中。

但形状是一种或另一种连接方式。有没有办法删除它?我没有使用InstanceCountDivisor,但我不知道它是如何工作的。我用它做了一些测试,但没有任何效果

0 投票
0 回答
20 浏览

opengl - OpenGL 实例化绘图是否有定义的绘制顺序?

我想使用 OpenGL 实例化绘制大量重叠的、不透明的对象。为了降低填充率,我想从靠近相机到远离它进行排序。如果我按照我希望绘制的顺序对缓冲区中的值进行排序,标准是否规定 OpenGL 必须按该顺序绘制它们?如果要并行或以未指定的顺序绘制缓冲区,那么对缓冲区进行排序将是一种巨大的计算浪费。

0 投票
1 回答
272 浏览

opengl - OpenGL SSBO 实例化

绑定 SSBO 并通过 gl_InstanceID 访问它似乎可行,但我得到了这些非常奇怪的位置工件,我不确定它们来自哪里。

我生成随机位置的方式非常标准,我还用一些调试线测试了这些位置。但是当我在顶点着色器中添加它们时它们不匹配。

着色器.vert

代码.cpp

在此处输入图像描述 在此处输入图像描述