diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 5b6a24911..1b5021528 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -5360,13 +5360,16 @@ namespace bgfx { namespace gl m_usedCount = (uint8_t)used; used = 0; - for (uint32_t ii = 0; ii < BX_COUNTOF(s_instanceDataName); ++ii) + for (uint32_t ii = 0, baseVertex = 0; ii < BX_COUNTOF(s_instanceDataName); ++ii, baseVertex += 16) { GLint loc = glGetAttribLocation(m_id, s_instanceDataName[ii]); if (-1 != loc) { BX_TRACE("instance data %s: %d", s_instanceDataName[ii], loc); - m_instanceData[used++] = loc; + m_instanceData[used] = loc; + m_instanceOffset[used] = uint16_t(baseVertex); + + used++; } } BX_ASSERT(used < BX_COUNTOF(m_instanceData) @@ -5433,14 +5436,14 @@ namespace bgfx { namespace gl void ProgramGL::bindInstanceData(uint32_t _stride, uint32_t _baseVertex) const { - uint32_t baseVertex = _baseVertex; for (uint32_t ii = 0; -1 != m_instanceData[ii]; ++ii) { GLint loc = m_instanceData[ii]; lazyEnableVertexAttribArray(loc); + + const uint32_t baseVertex = _baseVertex + m_instanceOffset[ii]; GL_CHECK(glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, _stride, (void*)(uintptr_t)baseVertex) ); GL_CHECK(glVertexAttribDivisor(loc, 1) ); - baseVertex += 16; } } diff --git a/src/renderer_gl.h b/src/renderer_gl.h index 03c7daf55..e75e872e3 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -1505,8 +1505,10 @@ namespace bgfx { namespace gl uint8_t m_unboundUsedAttrib[Attrib::Count]; // For tracking unbound used attributes between begin()/end(). uint8_t m_usedCount; uint8_t m_used[Attrib::Count]; // Dense. - GLint m_attributes[Attrib::Count]; // Sparse. - GLint m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT+1]; + GLint m_attributes[Attrib::Count]; // Sparse. + + GLint m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT+1]; + uint16_t m_instanceOffset[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT]; GLint m_sampler[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS]; uint8_t m_numSamplers;