C++ SSBO哈希表,缺少值

C++ SSBO哈希表,缺少值,c++,opengl,hash,graphics,glsl,C++,Opengl,Hash,Graphics,Glsl,我正在尝试运行一个小的数据压缩实验。我试图将3D纹理压缩到哈希表中,以避免存储空的体积信息 为此,我编写了散列函数和检索函数(它们位于不同的着色器中): struct体素 { 整数填充; ivec4位置; vec4正常; vec4颜色; }; 布局(std430,绑定=0)缓冲区体素\u缓冲区 { uint指数; 体素体素[]; }; //数据存储着色器 int a_size=10000000; 空心插入(vec3位置,体素值){ ivec3离散化=ivec3(位置/v_尺寸); int ind

我正在尝试运行一个小的数据压缩实验。我试图将3D纹理压缩到哈希表中,以避免存储空的体积信息

为此,我编写了散列函数和检索函数(它们位于不同的着色器中):

struct体素
{
整数填充;
ivec4位置;
vec4正常;
vec4颜色;
};
布局(std430,绑定=0)缓冲区体素\u缓冲区
{
uint指数;
体素体素[];
};
//数据存储着色器
int a_size=10000000;
空心插入(vec3位置,体素值){
ivec3离散化=ivec3(位置/v_尺寸);
int index=int(pow(7,离散化的.x)*pow(2,离散化的.y)*pow(3,离散化的.z))%a_大小;
对于(int i=0;i您的哈希函数


非常差。由于
离散化
是一个
ivec3
,整个操作都是对整数进行的,术语
pow(2,离散化.y)
0
用于
离散化的任何时间。y
=31
,这将导致要计算的完整哈希值为
0
。此外,对于
离散化的.y<0
,您应该得到0,因为结果分数也不能用
int
类型表示。此外,二次探测也失败s表示
index==0
,因为您将探测50次相同的索引。

Ypu对该缓冲区进行了完全不相干、不同步的非atmoic读写,您认为这将如何工作?读操作是同步的,它们位于不同的着色器中,在写入一个着色器之后调用,并通过SBBO内存位阻止。在Nvidia中驱动程序(我当前使用的驱动程序),非同步写入不是一个问题,因为我只关心缓冲区中正确索引处的某些内容。我知道这是有效的,因为它是使用线性缓冲进行测试的,没有任何问题。换句话说,是我对函数进行哈希运算导致了问题,而不是缺少同步。内存cor破裂或丢失是可以接受的。我说的是在“存储”着色器中检查碰撞的读取。这种碰撞处理肯定会失败。你需要原子来工作。这是一个公平的批评,根据我的经验,原子操作对这类事情没有多大影响(使用它们确实可以获得更好的结果,但不能解释全部问题)。尽管如此,我还是按照建议添加了它们,并再次运行了该程序。输出是相同的。老实说,我认为问题可能在于我哈希的方式。
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;
    }
}
int(pow(7, discretized.x) * pow(2, discretized.y) * pow(3, discretized.z)) % a_size;