C++ 一个粒子太多:生成GL\u无效\u值错误&书信电报;启动>;不满足着色器存储缓冲区的最低对齐要求

C++ 一个粒子太多:生成GL\u无效\u值错误&书信电报;启动>;不满足着色器存储缓冲区的最低对齐要求,c++,opengl,spir-v,C++,Opengl,Spir V,我的粒子系统有一个奇怪的错误。我可以动态设置缓冲区的大小,并且可以根据需要更改粒子的数量。我在玩30k、40k等数字,以及介于两者之间的所有数字。最大值为40800。。。然后我从输出终端的标题中得到错误 代码如下: Log::logInfo(m_Name, "Bind particle buffers..."); /// ssbo sizes constexpr ptrdiff_t positionSSBOsize = sizeof(glm::vec4) * NUM_PARTI

我的粒子系统有一个奇怪的错误。我可以动态设置缓冲区的大小,并且可以根据需要更改粒子的数量。我在玩30k、40k等数字,以及介于两者之间的所有数字。最大值为40800。。。然后我从输出终端的标题中得到错误

代码如下:

Log::logInfo(m_Name, "Bind particle buffers...");

    /// ssbo sizes
    constexpr ptrdiff_t positionSSBOsize = sizeof(glm::vec4) * NUM_PARTICLES;
    constexpr ptrdiff_t velocitySSBOsize = sizeof(glm::vec2) * NUM_PARTICLES;
    constexpr ptrdiff_t forceSSBOsize = sizeof(glm::vec2) * NUM_PARTICLES;
    constexpr ptrdiff_t densitySSBOsize = sizeof(float) * NUM_PARTICLES;
    constexpr ptrdiff_t pressureSSBOsize = sizeof(float) * NUM_PARTICLES;

    /// total size
    constexpr ptrdiff_t packedBufferSize = positionSSBOsize + velocitySSBOsize + forceSSBOsize + densitySSBOsize + pressureSSBOsize;

    /// ssbo offsets
    constexpr ptrdiff_t positionSSBOoffset = 0;
    constexpr ptrdiff_t velocitySSBOoffset = positionSSBOsize;
    constexpr ptrdiff_t forceSSBOoffset = velocitySSBOoffset + velocitySSBOsize;
    constexpr ptrdiff_t densitySSBOoffset = forceSSBOoffset + forceSSBOsize;
    constexpr ptrdiff_t pressureSSBOoffset = densitySSBOoffset + densitySSBOsize;

    /// set inital positions
    this->initParticleSeeds(packedBufferSize, positionSSBOsize, m_PackedParticlesBufferHandle);

    /// bind to inital positions data
    this->bindBufferToVertexArrayObject(m_ParticlePositionVaoHandle, m_PackedParticlesBufferHandle, PARTICLE_SEEDS_NR);

    /// bindings 
    //@TODO: Here we got a problem after increasing NUM_PARTICLES, the error that the MAX_SHADER_STORAGE_BUFFER_BINDINGS are reached, thats why INVALID_ERROR is thrown
    Log::logInfo(m_Name, "Bind particle buffers: positions");
    glBindBufferRange(GL_SHADER_STORAGE_BUFFER, SHADER_PART_POS_NR, m_PackedParticlesBufferHandle, positionSSBOoffset, positionSSBOsize);   /// Particle Positions
    Log::logInfo(m_Name, "Bind particle buffers: velocities");
    glBindBufferRange(GL_SHADER_STORAGE_BUFFER, SHADER_PART_VEL_NR, m_PackedParticlesBufferHandle, velocitySSBOoffset, velocitySSBOsize);   /// Particle Velocities
    Log::logInfo(m_Name, "Bind particle buffers: force");
    glBindBufferRange(GL_SHADER_STORAGE_BUFFER, SHADER_PART_FRC_NR, m_PackedParticlesBufferHandle, forceSSBOoffset, forceSSBOsize);         /// Particle Force
    Log::logInfo(m_Name, "Bind particle buffers: density");
    glBindBufferRange(GL_SHADER_STORAGE_BUFFER, SHADER_PART_DNS_NR, m_PackedParticlesBufferHandle, densitySSBOoffset, densitySSBOsize);     /// Particle Density
    Log::logInfo(m_Name, "Bind particle buffers: pressure");
    glBindBufferRange(GL_SHADER_STORAGE_BUFFER, SHADER_PART_PRS_NR, m_PackedParticlesBufferHandle, pressureSSBOoffset, pressureSSBOsize);   /// Particle Pressure

    Log::logInitSucc(m_Name, "particle buffers");
正如我所说,一切正常,除了在40801粒子时,以下错误显示在我的日志中,并且我的一些缓冲区不再加载:

[APPLICATION]::  Bind particle buffers...
[APPLICATION]::  Init particle seeds ...
[APPLICATION]::  Save data in buffer ...

[SOURCE_API]::   [TYPE_OTHER][131185] [SEVERITY_NOTIFICATION] Buffer detailed info: Buffer object 3 (bound to GL_SHADER_STORAGE_BUFFER, usage hint is GL_STATIC_DRAW) will use VIDEO memory as the source for buffer object operations.

[APPLICATION]::  Init particle seeds SUCCESS!
[APPLICATION]::  Bind vertex array object (VAO) to buffer ...
[APPLICATION]::  Init VAO SUCCESS!
[APPLICATION]::  Bind particle buffers: positions
[APPLICATION]::  Bind particle buffers: velocities

[SOURCE_API]::   [TYPE_ERROR][1281] [SEVERITY_HIGH] GL_INVALID_VALUE error generated. <start> does not meet minimum alignment requirements for shader storage buffers.

[APPLICATION]::  Bind particle buffers: force

[SOURCE_API]::   [TYPE_ERROR][1281] [SEVERITY_HIGH] GL_INVALID_VALUE error generated. <start> does not meet minimum alignment requirements for shader storage buffers.

[APPLICATION]::  Bind particle buffers: density
[APPLICATION]::  Bind particle buffers: pressure

[SOURCE_API]::   [TYPE_ERROR][1281] [SEVERITY_HIGH] GL_INVALID_VALUE error generated. <start> does not meet minimum alignment requirements for shader storage buffers.
[应用]::绑定粒子缓冲区。。。
[应用]::初始化粒子种子。。。
[应用程序]::将数据保存在缓冲区中。。。
[SOURCE_API]::[TYPE_OTHER][131185][SEVERITY_NOTIFICATION]缓冲区详细信息:缓冲区对象3(绑定到GL_SHADER_STORAGE_Buffer,使用提示为GL_STATIC_DRAW)将使用视频内存作为缓冲区对象操作的源。
[应用]::初始化粒子种子成功!
[应用]::将顶点数组对象(VAO)绑定到缓冲区。。。
[应用]::初始化VAO成功!
[应用]::绑定粒子缓冲区:位置
[应用]::绑定粒子缓冲区:速度
[SOURCE_API]:[TYPE_ERROR][1281][SEVERITY_HIGH]生成GL_无效值错误。不满足着色器存储缓冲区的最低对齐要求。
[应用]::绑定粒子缓冲区:强制
[SOURCE_API]:[TYPE_ERROR][1281][SEVERITY_HIGH]生成GL_无效值错误。不满足着色器存储缓冲区的最低对齐要求。
[应用]::绑定粒子缓冲区:密度
[应用]::绑定粒子缓冲区:压力
[SOURCE_API]:[TYPE_ERROR][1281][SEVERITY_HIGH]生成GL_无效值错误。不满足着色器存储缓冲区的最低对齐要求。

使用
glBindBufferRange
无法将任意偏移量写入缓冲区。偏移量必须是各个缓冲区偏移量对齐的倍数,这取决于所使用的缓冲区类型。此限制取决于平台,并由GPU上的底层内存体系结构施加

对于SSBO(此处使用),可使用以下代码查询相关路线:

glGetIntegeri_v(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, &alignment);

更多细节可以在

Is
Velocitysbooffset
GL\u SHADER\u STORAGE\u BUFFER\u OFFSET\u ALIGNMENT的倍数中找到?老实说,我不知道。我在这里或互联网上找不到有关GL_着色器_存储_缓冲区_偏移_对齐的信息。如何确保它是多重的?GL\U着色器\U存储\U缓冲区\U偏移量\U对齐是可以查询的参数之一。原来GL\U着色器\U存储\U缓冲区\U偏移量\U对齐是32。设置od粒子数,并将velocitySSBOoffset设置为32的倍数,解决了此错误!非常感谢你!你能解释为什么会这样吗?我使用GLint64着色器存储缓冲区偏移对齐;glGetInteger64v(GL_着色器_存储_缓冲区_偏移量_对齐和着色器存储缓冲区偏移量对齐),格尔杰不为人知