我正在试着做一个数据压缩实验。我试图压缩三维纹理为哈希表,以避免存储空卷信息。
为此,我编写了散列函数和恢复函数(它们在不同的着色器中):
struct Voxel
{
int filled;
ivec4 position;
vec4 normal;
vec4 color;
};
layout(std430, binding = 0) buffer voxel_buffer
{
uint index;
Voxel voxels[];
};
// Data storing shader
int a_size = 10000000;
void insert(vec3 pos, Voxel value) {
ivec3 discretized = ivec3(pos / v_size);
int index = int(pow(7, discretized.x) * pow(2, discretized.y) * pow(3, discretized.z)) % a_size;
for(int i=0; i<50; i++) {
if(atomicCompSwap(voxels[index].filled, 0, 1) == 0) {
Voxel c_voxel = voxels[index];
value.position = ivec4(discretized, 1);
voxels[index] = value;
break;
}
index = (index * index) % a_size;
}
}
//Data reading shader
int a_size = 10000000;
vec4 fetch(vec3 pos) {
ivec3 discretized = ivec3(pos / v_size);
int index = int(pow(7, discretized.x) * pow(2, discretized.y) * pow(3, discretized.z)) % a_size;
for(int i=0; i<50; i++) {
Voxel c_voxel = voxels[index];
if(ivec4(discretized,1) == voxels[index].position)
return voxels[index].color;
index = (index * index) % a_size;
}
}然而,我目前的问题是,我遗漏了大约90%的体素值:

预期的结果是:

对于什么可能是错误,我有一些想法,但似乎没有一个是错的:
你知道为什么压缩时我会失去这么多信息吗?
编辑:根据注释添加原子操作
编辑2:在评论中找到了解决方案,结果:

一些记忆丧失仍然发生,但这是意料之中的。
发布于 2019-01-21 01:45:41
您的散列函数
int(pow(7,discreed.x)* pow(2,discreed.y)* pow(3,discreed.z)% a_size;
很穷。因为discretized是一个ivec3,所以整个操作都在处理整数,而术语pow(2, discretized.y)将是0 (每当discretized.y是>= 31时),从而得到要计算到0的完整哈希值。另外,对于discretized.y < 0,您应该得到0,因为生成的分数也不能由int类型表示。此外,您的二次探测对于index == 0也失败,因为您将探测相同索引的50倍。
https://stackoverflow.com/questions/54280066
复制相似问题