问题标签 [scenegraph]

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 投票
2 回答
1331 浏览

opengl - 在运行时在同一模型上使用不同的着色器

我已经在这里问过类似但有点不清楚的问题,但这次我将非常具体和直截了当。

假设我有一个演员,它抓住了一个力量。他开始使用绽放着色器发光,并在 10 秒后恢复正常,再次附加默认着色器。这个问题基本上归结为:

如何在运行时在同一模型上使用不同的着色器?

考虑以下非常简单的示例:

默认着色器:

RendererGLES20 中的渲染代码将是:

够简单!现在想象一下,演员得到了一些力量,并应用了以下疯狂的着色器:

疯狂着色器:

如您所见,为了将此着色器附加到模型,我需要将实际渲染器源代码修改为以下内容:

您会看到为了附加不同的着色器需要编写多么不同的代码。现在如果我想重新附加默认着色器怎么办?(这是着色器的附加和分离必须在运行时发生,例如:演员收集电源)。

有什么想法我可以如何有效且轻松地实现它以允许模型在运行时更改着色器?我只是期待一个好的实施/想法。各位大佬会怎么处理上面的问题呢?

0 投票
0 回答
137 浏览

c++ - 场景图子节点注册&拷贝构造函数

我有一个场景图,所有节点都派生自一个基类AbstractNodeAbstractNode有一个registerChild成员函数:

用于以标准方式注册子项(以便可以在基类接口中列出和修改它们)。它基本上将 name/child_pointer 对添加到哈希中。

因此,例如,类材料将像这样声明(缩短):

颜色是 AbstractNode 的另一个子类。

现在我想为 AbstractNode 实现一个复制构造函数。它必须复制注册子列表,并更新子成员指针。我想避免在所有基类中重新实现复制构造函数。这可能吗?

我曾考虑过处理指针偏移量、this子指针和子指针之间的问题。但是这些是否保证在两个实例之间保持不变?这对我来说似乎是一个很大的黑客......(而且我什至确信在子类化时不能保证这一点)

谢谢,

艾蒂安

0 投票
0 回答
170 浏览

sorting - 对对象层次结构中的兄弟姐妹进行排序

我已经实现了一个用于 2D 游戏的场景树。树节点包含变换和可绘制对象。

这是场景树的样子:

为了绘制场景,首先以深度优先顺序遍历树。在遍历期间,可绘制对象被收集在渲染队列中。然后将渲染队列传递给渲染器进行处理。

由于可绘制对象是按深度优先顺序收集的,这也是渲染器绘制它们的顺序。要更改绘图顺序,我必须重新排列树节点。例如,如果我想在节点 F 之前绘制节点 G,我必须交换它们。我想改变它,这样节点就不必再重新排列了。相反,渲染器应该能够自行对渲染队列进行排序。

问题:

每组兄弟节点(例如 [A, B, C] 或 [F, G] 或 [D, E])必须单独排序,以便层次结构保持完整。如果树节点直接排序,这不是问题。但是,如果将树展平为渲染队列,事情就会变得复杂。

我的问题:

如何在不干扰节点层次结构的情况下对渲染队列进行排序?
这类问题有替代解决方案吗?

附加信息:

我能找到的最好的资源是博客文章Order your graphics draw calls around。它解释了如何使用由多个信息块组合而成的 64 位密钥对渲染队列进行排序。不过,它并没有解决我遇到的问题。

你可能会问我为什么不满足于直接对树节点进行排序。有两个原因:首先,我想将关注点分开。重新排列场景树中的节点以使渲染器以正确的顺序绘制它们将不利于实现这一目标。其次,不可能从排序中排除不可见的节点/可绘制对象(而渲染队列仅包含可见的可绘制对象)。

0 投票
2 回答
3475 浏览

java - 覆盖绘图顺序scene2D的舞台

给你一个复杂的Scene2D图表,libgdx其中有几个Group'sActor's。您希望用户选择一些Actors并在最后绘制它们,以便它们看起来集中在任何其他Actors.

我想迭代Stage两次。第一次绘制未选中Actors的,第二次绘制选中的actors。但是,我看不到任何强制执行此行为的“好”方法。

我更喜欢干净的选项。我不想仅仅为了这个小小的添加而复制整个方法实现。

什么不起作用:

  • ( Actor's toFront) 方法只适用于它的兄弟姐妹。
  • 交换Actor's舞台中的位置:这会修改所Actors具有的变换。

需要考虑的场景:你有Root一个组gA和一个组gBGroup gA包含两个图像iA1iA2Group gB包含一个图像iB。假设首先将Group gA添加到阶段,并且图像iA1iB重叠;现在您要选择iA1并使其出现在iB上。我不想只打电话gA.toFront();这会将整个Group gA放在前面,这意味着iA2也放在前面。放iA2前面有将部分图像隐藏在Group gB内的不良影响

在此处输入图像描述

0 投票
1 回答
153 浏览

performance - 每个应用程序多个上下文与每个上下文多个应用程序

我想知道创建一个负责渲染所有应用程序元素的“系统”范围的渲染服务器是否是个好主意。目前,应用程序通常有自己的上下文,这意味着任何数据在不同应用程序中可能相同,它将在 GPU 内存中复制,并且更频繁的资源管理调用只会减少可用渲染调用的数量。据我了解,OpenGL 执行引擎/服务器本身在设计上是顺序/单线程的。所以从技术上讲,所有可能在应用程序中重用的东西,尤其是像位图或文本和 UI 的几何缓存这样的繁重的东西,只是因为不必要的传输和内存使用而阻塞了服务器。

跨多个应用程序共享场景图有什么缺点吗?自然,假设正确处理意外冻结的客户端。

0 投票
1 回答
930 浏览

javascript - Three.js - 计算相对旋转

我有一个THREE.Scene添加了两个网格的meshAmeshB,每个网格都以不同的方式旋转。我的目标是meshB从场景中移除并将其重新添加为 的子级meshA,同时保留其全局位置和旋转 - 换句话说,meshB在此代码之前和之后的位置和旋转应该相同。

我目前几乎可以工作的尝试如下:

定位工作正常;仅当两者都围绕同一轴旋转时,旋转才有效——如果并且已经meshA围绕不同的轴旋转,则在此代码之前和之后似乎会改变旋转。meshBmeshAmeshBmeshB

有什么想法可以纠正上面的代码(或不同方法的想法),以便meshB在被删除并重新添加到场景之前和之后仍然具有相同的“全局”旋转?

谢谢!

0 投票
1 回答
794 浏览

opengl - 对场景图概念的简单好奇

我正在使用 OpenGL 编写一个简单的 3D 引擎。我已经使用以下模式实现了一个简单的场景图:

但我想知道“渲染器”(实现着色器程序的类)是否也可以是场景节点(将渲染代码从 MeshSceneNode 提取到 RenderSceneNode)。对我来说这可能是一个正确的选择,因为如果我必须使用相同的顶点和片段着色器渲染多个网格(例如 42 个网格),那么绑定和取消绑定着色器程序一次而不是 42 次应该很有用!

那么您如何看待以下架构:

第一个代表我当前的概念(为简单起见,我不代表“Light”和“Camera”场景节点)。

在此处输入图像描述

因此,在这里,如果我想渲染我的 3 个网格(使用相同着色器的 3 个着色程序),我将为每帧绑定和取消绑定 3 次着色程序(在每个网格节点的“渲染”方法中)。

这是另一个概念:

在此处输入图像描述

正如您在上面看到的,这次我将在渲染节点中为所有子节点绑定一个唯一的着色器程序。所以它可能会更快。

你觉得我的想法怎么样?

0 投票
1 回答
66 浏览

css - 在场景图中获取所有具有 styleClass 的节点

我想在我的程序中定义一个全局搜索。我的程序在一个场景中有很多节点,并且可以搜索到不同节点上的很多常见事物。我想定义一个可搜索的类和一个在每个节点中搜索的方法。

因此,当我通过类选择器进行搜索时,我将能够访问所有节点以向用户突出显示它们。

例如,如果 Scene 或 Node 有这样的方法:

这当然可以通过递归迭代场景或节点子节点来完成,但在我看来它很重,所以我想知道是否存在这样的事情:

0 投票
1 回答
1068 浏览

c++ - 根据对象的位置将对象排序到前面或后面

我正在尝试正确排序我的可渲染对象/演员,并注意到我在墙壁上遇到了一些问题,因为它们是按中心点排序的。因此,我在绘制所有演员之前,根据他们与相机的距离,使用插入排序对他们进行排序。在那之后,我试图确定墙应该画在比赛场地的后面还是前面。为了解释这一点,游戏发生在一个由 6 个平面组成的立方体内。因为我可以围绕那个立方体旋转相机,所以我需要一个排序,根据这个排序将飞机放在前面/后面。所以这是一张图片,所以你知道我们在说什么:

在此处输入图像描述

你可以清楚地看到在那种蛇的前面发生了什么。

好的,这是我目前的排序:

为了确定它是否是Wall我使用的这种类型,dynamic_cast<Wall*>(val)但我没有将它们放在矢量的前面/后面,这取决于它。要记住对象返回它们的中心点。谁能引导我走向正确的道路?

0 投票
1 回答
1441 浏览

qt - QQuickItem 继承者中未处理的鼠标事件

我想用可拖动的 QQuickItems 编写简单的 Qt Quick 应用程序。由于项目中嵌入了 MouseArea,因此项目可以很好地拖动。但一个问题是鼠标事件不会被触发到虚拟重载函数中的 C++ 代码中。如何解决这个问题,或者可能有一些我没有找到的例子?

QML 文件:

C++ 类: