layout(std140) uniform node{
ivec4 splitPoint;
int dataPtr;
} nodes[1024];
整个阵列形成一个
Ahnentafel List
.
在C++中,结构看起来像这样:
struct Node{
glm::ivec4 splitPoint;
GLint dataPtr;
GLint padding[3];
};
我相信这是正确的,我上传了在缓冲区中构建的树。作为检查,我将缓冲区映射到主内存并检查值:
0x08AB6890 +0 +256 +0 +1 -1 -858993460 -858993460 -858993460
0x08AB68B0 +256 +0 +0 +0 -1 -858993460 -858993460 -858993460
0x08AB68D0 +256 +256 +0 +0 -1 -858993460 -858993460 -858993460
[...]
0x08AB7070 +0 +0 +0 +0 +2362 -858993460 -858993460 -858993460
float distanceFromSplitPlane;
while(nodes[n].dataPtr == -1){
vec3 splitDir = vec3(0,0,0);
if(nodes[n].splitDir == 0)
splitDir.x = 1;
else if(nodes[n].splitDir == 1)
splitDir.y = 1;
else
splitDir.z = 1;
distanceFromSplitPlane = dot(startP.xyz-(nodes[n].splitPoint.xyz/511.0), splitDir);
if(distanceFromSplitPlane >= 0)
n = 2 * n + 1;
else
n = 2 * n + 2;
}
gl_FragColor = vec4(dataPtr/6000.0, 0,1,1);
在这一点上,屏幕上应该有一个随机的颜色模式。但在大多数情况下,什么都看不见。
我尝试直接从节点获取值并得到正确的结果。。。所以我认为统一块数据的动态索引有问题。