Слишком много одной частицы: сгенерирована ошибка GL_INVALID_VALUE. <start>не соответствует минимальным требованиям выравнивания для буферов хранения шейдеров - PullRequest
0 голосов
/ 13 января 2019

Я получаю странную ошибку в моей системе частиц. Я динамически устанавливаю размер моих буферов и могу изменять количество своих частиц так, как хочу. Я играю с числами, такими как 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.

1 Ответ

0 голосов
/ 15 января 2019

Невозможно адресовать произвольные смещения в буфер с glBindBufferRange. Смещение должно быть кратным соответствующему выравниванию смещения буфера, которое зависит от используемого типа буфера. Это ограничение зависит от платформы и накладывается базовой архитектурой памяти на GPU.

Для SSBO (как здесь используется) соответствующее выравнивание можно запросить с помощью следующего кода:

glGetIntegeri_v(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, &alignment);

Более подробную информацию можно найти в спецификации OpenGL 4.6, раздел 6.7.1

...