C++ 一个粒子太多:生成GL\u无效\u值错误&书信电报;启动>;不满足着色器存储缓冲区的最低对齐要求
我的粒子系统有一个奇怪的错误。我可以动态设置缓冲区的大小,并且可以根据需要更改粒子的数量。我在玩30k、40k等数字,以及介于两者之间的所有数字。最大值为40800。。。然后我从输出终端的标题中得到错误 代码如下: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
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_着色器_存储_缓冲区_偏移量_对齐和着色器存储缓冲区偏移量对齐),格尔杰不为人知