问题标签 [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.
opengl - Opengl 实例化批处理
有没有办法在部分/批次中绘制实例缓冲区?
目前,我正在将所有几何图形推入大型 vbo,生成一个渲染脚本,该脚本通过着色器/纹理/图集对模型进行批处理,然后使用glDrawElements
计数和索引中的偏移量进行绘制。都好。
我正在考虑转向实例化以减少需要传输到 gpu 的数据量,但除了发送一堆偏移量作为实例化属性之外,我看不到开箱即用的方法一个opengl绘图调用。
我错过了什么吗?
three.js - 我们可以将 ThreeJs Helpers 与 InstancedMeshes 一起使用吗?
我是 Threejs 的新手,我正在尝试使用axesHelper来可视化场景中所有对象的三轴。早些时候我使用的是简单的网格,所有的助手都工作正常。最近我已经将一些对象移动到实例化网格中,并且助手已经停止为它们工作。我已经通过尝试使用两个助手来确认这一点。(箭头和轴助手)
我正在使用react-three-fiber编写 JSX 风格的threejs。这是曾经为我工作的代码。
这是新的不起作用。
所以现在我想确认我们是否可以将这些助手用于实例化网格?我尝试查看三个文档,但找不到与此问题相关的任何答案。我在 Threejs r127 上。
c# - Rust 游戏如何放置数百万的草、石和树
Rust 在其地图上拥有数以百万计的草、岩石和树木实例,这些实例长达 8 公里。
草在运行时是否在玩家周围动态放置?如果是这样,是在 GPU 上以某种方式完成还是使用着色器?
在我的游戏中,我们使用顶点颜色和光线投射来放置植被,并存储在运行时通过间接 GPU 实例初始化的变换数据。
但是,我无法想象这会与树木之类的东西很好地扩展。场景中是否真的有成千上万个网格对撞机始终处于活动状态?我想也许他们可能会将所有这些网格碰撞器存储在场景中,并且可以标记游戏对象,如果你用工具击中它,它会向它添加一个“树”组件。
我是否采用“预先生成所有内容,在运行时实例化”的方法朝着正确的方向前进?
我已经对此进行了测试,它确实有效,产生了 2400 万个实例(需要 20 分钟进行光线投射),然后用这些实例初始化 GPU。
这很酷,尽管它会导致我的 Unity 编辑器在一段时间后崩溃(内存泄漏?)。
也许您在运行前存储实例,然后当您启动分离服务器时,您会进行所有光线投射并放置所有树木、岩石和其他交互式对象。
但我担心,如果我尝试存储 10000 个游戏对象(用于交互,诸如可砍伐的树木、可开采的岩石之类的东西),性能会下降。
android - 安卓 7.0 及以下配备 Adreno 的手机上关于 GPU 实例化的奇怪错误
我在使用GPU实例化的时候,发现在安卓7.0及以下搭载高通处理器的手机上存在一个难以理解的问题。这似乎与内存布局有关,但仅在上述手机类型上发生。让我们逐步重现此问题。首先,有一个用于 GPU Instancing 的着色器
还有一个程序可以使用这个着色器一次绘制 5 个四边形网格:
如果我们更改着色器代码,将 _MainTexOffsetArray 移动到另一个统一缓冲区:
如果我们恢复着色器代码并在 _RenderDataArray 和 _MainTexOffsetArray 之间添加另一个属性:
如果我们让fragment shader不直接使用uniform,而是使用顶点插值,那么一切都OK。我这里就不展示普通图片了。
同样,在我们的多次测试中,只有搭载高通处理器的安卓7.0及以下版本的手机才会出现这个问题;使用RenderDoc查看更多细节,统一数据没有传入片段Shader。我不确定是什么原因。是因为同一着色器程序中的顶点着色器和片段着色器在Android 7.0中不能同时使用统一数据还是这是一个错误?
webgl2 - 使用 UBO 进行 WebGL2 实例化
我正在尝试使用统一缓冲区对象在我的引擎中实现几何实例化。这个想法很简单。我将所有可见实体状态填充到当前场景的单个 UBO。然后在命令排序之后:
- 如果没有实例化 - 我绑定当前实例的 InstancingUBO 范围(glBindBufferRange)
- 使用实例化 - 我绑定了 2 个缓冲区:全范围内的 InstancingUBO 和全范围内的第二个动态缓冲区 InstancingIndexesUBO。
由于对齐要求,一个实例条目具有精确的 256 字节大小。
顶点伪着色器如下所示:
"
"
不确定这里的问题是什么,但事实证明代码在不同的设备/平台上的工作方式完全不同。
例如,提供的代码在 GL4.5 Core OpenGL 中完美运行。它也适用于 WebGL2:FireFox、Mac Chrome 和 Mac Safary。但它不适用于 Windows Chrome 和所有 Windows Chromium 浏览器(Edge、Opera)。(只是缺少实例对象)。
为了使其在 Windows Chromium 中工作,我必须以这种方式更改 Instancing UBO 声明:
所以我为两个实例化 UBO 而不是 128 贴了 2 个实例。但在这种情况下,它在 Windows FireFox、Mac Chrome 和 Mac Safary 中停止工作。它仍然无法在 Mobile iOS Safari 中运行。
看起来问题与 InstancingUBO 的动态索引有关。WebGL2 标准不支持吗?
如何使用 UBO 在包括移动设备在内的所有平台/浏览器上进行实例化?
c++ - 使用计算着色器更新实例数据
我无法让实例化几何体与计算着色器一起工作(我让这两件事都独立工作,但不知道如何组合它们)。下面是一个渲染具有不同偏移量的彩色四边形实例的示例。我希望能够通过计算着色器更新这些偏移量。
计算着色器:
顶点着色器:
rendering - DirectX - 何时使用实例化,何时不使用?
我正在使用directx 11 制作应用程序。我想首先使用实例化,所以为了简单起见,我将整个管道组织为始终使用实例化。这意味着目前如果我想在我的场景中绘制一个几何图形,它仍然会通过实例渲染。
我的问题是(是)实例化引入了什么开销?一般来说,这种方法是一种不好的做法吗?如果是这样,是否有关于如何决定何时使用实例化以及何时不使用的规则?
一个对我没有帮助的类似问题:与实例渲染相关的开销是多少?