void OgreGeometryBuffer::setVertexBuffer(size_t count) const { // We first check if some other buffer has already allocated a suited buffer // for us Ogre::HardwareVertexBufferSharedPtr already_created = d_owner.getVertexBuffer(count); if (!already_created.isNull()) { d_hwBuffer = already_created; } else { // Create the a new vertex buffer d_hwBuffer = Ogre::HardwareBufferManager::getSingleton(). createVertexBuffer(getVertexAttributeElementCount()*sizeof(float), count, Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE, false); } if (d_hwBuffer.isNull()) { throw RendererException("Failed to create Ogre vertex buffer, " "probably because the vertex layout is invalid."); } // bind the vertex buffer for rendering d_renderOp.vertexData->vertexBufferBinding->setBinding(0, d_hwBuffer); }
//----------------------------------------------------------------------------// void OpenGL3GeometryBuffer::finaliseVertexAttributes() const { //On OpenGL desktop versions we want to bind both of the following calls, otherwise vbos are enough as the following calls //only affect the vbo (which may be tied to a vao) if (OpenGLInfo::getSingleton().isVaoSupported()) { d_glStateChanger->bindVertexArray(d_verticesVAO); } d_glStateChanger->bindBuffer(GL_ARRAY_BUFFER, d_verticesVBO); GLsizei stride = getVertexAttributeElementCount() * sizeof(GL_FLOAT); const CEGUI::OpenGLBaseShaderWrapper* gl3_shader_wrapper = static_cast<const CEGUI::OpenGLBaseShaderWrapper*>(d_renderMaterial->getShaderWrapper()); //Update the vertex attrib pointers of the vertex array object depending on the saved attributes int dataOffset = 0; const size_t attribute_count = d_vertexAttributes.size(); for (size_t i = 0; i < attribute_count; ++i) { switch(d_vertexAttributes.at(i)) { case VAT_POSITION0: { GLint shader_pos_loc = gl3_shader_wrapper->getAttributeLocation("inPosition"); glVertexAttribPointer(shader_pos_loc, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(dataOffset * sizeof(GLfloat))); glEnableVertexAttribArray(shader_pos_loc); dataOffset += 3; } break; case VAT_COLOUR0: { GLint shader_colour_loc = gl3_shader_wrapper->getAttributeLocation("inColour"); glVertexAttribPointer(shader_colour_loc, 4, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(dataOffset * sizeof(GLfloat))); glEnableVertexAttribArray(shader_colour_loc); dataOffset += 4; } break; case VAT_TEXCOORD0: { GLint texture_coord_loc = gl3_shader_wrapper->getAttributeLocation("inTexCoord"); glVertexAttribPointer(texture_coord_loc, 2, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(dataOffset * sizeof(GLfloat))); glEnableVertexAttribArray(texture_coord_loc); dataOffset += 2; } break; default: break; } } }