我正在尝试使用 Barnes-Hut 树算法编写用于模拟 n 体问题的代码。我计划在未来使用 CUDA,因此希望我的四叉树数据结构不由堆对象组成。
作者从 Martin Burtscher 和 Keshav Pingali 的论文“基于树的 Barnes Hut n-Body 算法的高效 CUDA 实现”(抱歉找不到链接)中指出:
动态数据结构如树通常由堆对象构建,其中每个堆对象包含多个字段,例如子指针和数据字段,并且是动态分配的。因为堆对象的动态分配和访问往往很慢,所以我们使用基于数组的数据结构。如果数组元素是具有多个字段的对象,则无法合并对数组的访问,因此我们使用多个对齐的标量数组,每个字段一个,如图 6.6 所示。因此,我们的代码使用数组索引而不是指向树节点的指针。
我了解对齐标量数组的部分(即并行计算中的 SOA 与 AOS 习惯用法),但不幸的是,作者没有解释如何使用数组构造四叉树。
我的问题是如何使用数组实现四叉树数据结构(使用插入空间点的方法)?我知道如何使用节点结构和子节点指针等以传统方式实现四叉树。有人可以提供详细说明如何使用数组执行此操作的参考。甚至关于如何使用数组实现二叉树(或任何树)的信息在这里也可能有用。
我正在为物理引擎制作一个相对简单的渲染(类似于这个)。我只是在学习 OpenGL 并且一直在关注本教程. 我希望我的渲染器能够处理从以下类型中选择的少量灯光:定向光、点光、聚光灯和区域光。我也想要使用阴影贴图的简单阴影。例如,一个场景可能包含两个聚光灯或一个定向光或一个点光源和一个聚光灯等。目前我有一个更大的着色器来处理所有灯光,但是现在我正在尝试阴影贴图,它看起来很轻最好(从模块化设计的角度来看)为每种灯光或至少每种灯光类型使用不同的着色器。我想知道从效率的角度来看,这是否是一个合理的想法。为了使这更具体,我当前的顶点看起来像:
#version 130
in vec3 position;
in vec3 normal;
in vec2 atexture;
out vec3 FragPos;
out vec3 Normal;
out vec2 TexCoord;
out vec4 FragPosLightSpace;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform mat4 lightView;
uniform mat4 lightProjection;
void main()
{
gl_Position = projection * view * model * vec4(position.x, position.y, position.z, 1.0);
FragPos = vec3(model * vec4(position, 1.0));
Normal = normalize(normal);
TexCoord = atexture;
FragPosLightSpace = lightProjection * lightView * vec4(FragPos, …
Run Code Online (Sandbox Code Playgroud)