Code: Select all
Ogre::SceneNode* d_node_planet = d_root_node->createChildSceneNode("d_node_planet");
Ogre::WireBoundingBox* mWireBoundingBox1 = OGRE_NEW Ogre::WireBoundingBox();
Ogre::WireBoundingBox* mWireBoundingBox2 = OGRE_NEW Ogre::WireBoundingBox();
mWireBoundingBox1->setupBoundingBox(d_node_planet->_getWorldAABB());
mWireBoundingBox2->setupBoundingBox(d_node_planet->_getWorldAABB());
OGRE_DELETE mWireBoundingBox1;
OGRE_DELETE mWireBoundingBox2;
My env is ogre.1.9,at windows ,use GLES2 RenderSystems.
When i use Direct3D9 RenderSystems anything is ok.
I do not understand something at this function:
Code: Select all
void GLES2StateCacheManagerImp::bindGLBuffer(GLenum target, GLuint buffer, GLenum attach, bool force)
{
bool update = false;
BindBufferMap::iterator i = mActiveBufferMap.find(target);
if (i == mActiveBufferMap.end())
{
// Haven't cached this state yet. Insert it into the map
mActiveBufferMap.insert(BindBufferMap::value_type(target, buffer));
update = true;
}
else if((*i).second != buffer || force) // Update the cached value if needed
{
(*i).second = buffer;
update = true;
}
// Update GL
if(update)
{
if(target == GL_FRAMEBUFFER)
{
OGRE_CHECK_GL_ERROR(glBindFramebuffer(target, buffer));
}
else if(target == GL_RENDERBUFFER)
{
OGRE_CHECK_GL_ERROR(glBindRenderbuffer(target, buffer));
}
else
{
OGRE_CHECK_GL_ERROR(glBindBuffer(target, buffer));
}
}
}
void GLES2StateCacheManagerImp::deleteGLBuffer(GLenum target, GLuint buffer, GLenum attach, bool force)
{
// Buffer name 0 is reserved and we should never try to delete it
if(buffer == 0)
return;
BindBufferMap::iterator i = mActiveBufferMap.find(target);
if (i != mActiveBufferMap.end() && ((*i).second == buffer || force))
{
if(target == GL_FRAMEBUFFER)
{
OGRE_CHECK_GL_ERROR(glDeleteFramebuffers(1, &buffer));
}
else if(target == GL_RENDERBUFFER)
{
OGRE_CHECK_GL_ERROR(glDeleteRenderbuffers(1, &buffer));
}
else
{
OGRE_CHECK_GL_ERROR(glDeleteBuffers(1, &buffer));
}
// Currently bound buffer is being deleted, update the cached value to 0,
// which it likely the buffer that will be bound by the driver.
// An update will be forced next time we try to bind on this target.
(*i).second = 0;
}
}
and the mActiveBufferMap first is GL_ARRAY_BUFFER enum second is buffer index.
So when bindGLBuffer different buffer at GL_ARRAY_BUFFER(Ogre::HardwareVertexBufferSharedPtr use this),and deleteGLBuffer after will case a problem.
like this
bindGLBuffer(GL_ARRAY_BUFFER,1) mActiveBufferMap[GL_ARRAY_BUFFER] = 1
bindGLBuffer(GL_ARRAY_BUFFER,2) mActiveBufferMap[GL_ARRAY_BUFFER] = 2 the buffer name 1 is out of control
deleteGLBuffer(GL_ARRAY_BUFFER,1) mActiveBufferMap[GL_ARRAY_BUFFER] = 2 so can not find it and can not glDeleteBuffers buffer 1
deleteGLBuffer(GL_ARRAY_BUFFER,2) mActiveBufferMap[GL_ARRAY_BUFFER] = 2 find it glDeleteBuffers buffer 2
It's any thing wrong for my usage?