我正在开发一个 Opengl 光线追踪器,它能够加载 obj 文件并对其进行光线追踪。我的应用程序使用 assimp 加载 obj 文件,然后使用着色器存储对象将所有三角形面(顶点和索引)发送到片段着色器。基本结构是将结果从片段着色器渲染到四边形。
当我加载更大的 obj-s(超过 100 个三角形)时,计算机需要很长时间才能完成交点,因此我开始创建 BVH-tree 以加快处理速度。我的 BVH 根据 AABB 中包含的三角形面的平均中值,递归地将空间分成两个轴对齐的边界框。
我成功构建了 BVH 树结构(在 CPU 上),现在我想将其转换为一个简单的数组,然后将其发送到片段着色器(到着色器存储缓冲区)。
这是我的 BVH 类的结构。
class BvhNode {
public:
BBox bBox;
vector<BvhNode> children;
bool isLeaf;
int depthOfNode;
vector<glm::vec3> primitiveCoordinates;
BvhNode() {}
~BvhNode() {}
BvhNode(vector<glm::vec3> &primitiveCoordinates) {
this->primitiveCoordinates = primitiveCoordinates;
}
void buildTree(vector<glm::vec3> &indicesPerFaces, int depth) {...}
glm::vec3 calculateCenterofTriangle(glm::vec3 vec, glm::vec3 vec1, glm::vec3 vec2) {...}
glm::vec3 getCoordinatefromIndices(float index) {...}
BBox getBBox(vector<glm::vec3> &indices) {...}
};
但首先我想将它转换为一个简单的数组,因为 GLSL 不支持指针。我读过关于可以将二叉树转换为数组的信息(当然,如果树是完整的)。我正在拔头发。我如何遍历整个节点,包括子节点,当然还有如何用空节点完成它(以实现完整二叉树的定义)?我开始编写如下所示的方法,但是当我将nodes
变量声明为全局变量时出现分段错误。我不知道为什么。
vector<BvhNode> nodes; // it is a global variable
void putNodeIntoArray(BvhNode node) {
nodes.push_back(node.children.at(0));
nodes.push_back(node.children.at(1));
}
我想,当我创建树时,我需要以某种方式在左右孩子开始的每个节点上签名。
任何帮助表示赞赏。