bool SciIllLib::CMesh::InitializeGLBuffer() { CGLInfo::CheckError("IntializeGLBuffer"); GLint locAttrVertex = m_shader->attribLocation("vertex"); GLint locAttrNormal = m_shader->attribLocation("normal"); GLint locAttrTexCoord = m_shader->attribLocation("texCoord"); GLint locAttrTangent = m_shader->attribLocation("tangent"); GLint locAttrBinormal = m_shader->attribLocation("binormal"); glGenVertexArrays(1, &m_vao); glBindVertexArray(m_vao); glGenBuffers(5, &m_vbo[0]); bool found = false; found |= setupVertexAttrib(locAttrVertex, m_vbo[VBO_VERTEX], 4, m_arrVertex); found |= setupVertexAttrib(locAttrNormal, m_vbo[VBO_NORMAL], 4, m_arrNormal); found |= setupVertexAttrib(locAttrTexCoord, m_vbo[VBO_TEXCOORD], 2, m_arrTexCoord); if (locAttrTangent * locAttrBinormal > 0) { calculateTB(m_arrVertex, m_arrTexCoord); found |= setupVertexAttrib(locAttrTangent, m_vbo[VBO_TANGENT], 3, m_arrTangent); found |= setupVertexAttrib(locAttrBinormal, m_vbo[VBO_BINORMAL], 3, m_arrBinormal); } if (found) { glGenBuffers(1, &m_vboIdx); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vboIdx); glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_countIdx * sizeof(GLuint), m_arrIdx, GL_STATIC_DRAW); } cleanupBuffers(); glBindVertexArray(0); return true; }
/** * Loada heightmap and create the mesh. * @param filename filename that contains the heightmap * @param scale that is applied to the height (compared to max(width,height)) * @param locAttrVertex location/index of the vertexattribute vertex-position * @param locAttrNormal location/index of the vertexattribute vertex-normal * @param locAttrTexCoord location/index of the vertexattribute vertex-texture coordinate */ bool SciIllLib::CMesh::InitializeGLBuffer() { CGLInfo::CheckError("IntializeGLBuffer"); GLint locAttrVertex = m_shader->attribLocation("vertex"); GLint locAttrNormal = m_shader->attribLocation("normal"); GLint locAttrTexCoord = m_shader->attribLocation("texCoord"); GLint locAttrTangent = m_shader->attribLocation("tangent"); GLint locAttrBinormal = m_shader->attribLocation("binormal"); glGenVertexArrays(1, &m_vao); glBindVertexArray(m_vao); glGenBuffers(5, &m_vbo[0]); bool found = false; found |= setupVertexAttrib(locAttrVertex, m_vbo[VBO_VERTEX], 4, m_arrVertex); found |= setupVertexAttrib(locAttrNormal, m_vbo[VBO_NORMAL], 4, m_arrNormal); found |= setupVertexAttrib(locAttrTexCoord, m_vbo[VBO_TEXCOORD], 2, m_arrTexCoord); if (locAttrTangent * locAttrBinormal > 0){ calculateTB(m_arrVertex, m_arrTexCoord); found |= setupVertexAttrib(locAttrTangent, m_vbo[VBO_TANGENT], 3, m_arrTangent); found |= setupVertexAttrib(locAttrBinormal, m_vbo[VBO_BINORMAL], 3, m_arrBinormal); } //found |= setupVertexAttrib(locAttrTangent, m_vbo[VBO_TANGENT], 3, m_arrTangent); //found |= setupVertexAttrib(locAttrBinormal, m_vbo[VBO_BINORMAL], 3, m_arrBinormal); /* int idx = 0; if (locAttrVertex >= 0) { glBindBuffer(GL_ARRAY_BUFFER, m_vbo[VBO_VERTEX]); glBufferData(GL_ARRAY_BUFFER, m_countElements * 4 * sizeof(GLfloat), m_arrVertex, GL_STATIC_DRAW); glVertexAttribPointer(locAttrVertex, 4, GL_FLOAT, GL_FALSE, 0, 0); CGLInfo::CheckError("VA1 initialized ?"); glEnableVertexAttribArray(locAttrVertex); CGLInfo::CheckError("VA1 initialized !"); } if (locAttrNormal >= 0) { glBindBuffer(GL_ARRAY_BUFFER, m_vbo[VBO_NORMAL]); glBufferData(GL_ARRAY_BUFFER, m_countElements * 4 * sizeof(GLfloat), m_arrNormal, GL_STATIC_DRAW); glVertexAttribPointer(locAttrNormal, 4, GL_FLOAT, GL_FALSE, 0, 0); CGLInfo::CheckError("VA2 initialized ?"); glEnableVertexAttribArray(locAttrNormal); CGLInfo::CheckError("VA2 initialized"); } if (locAttrTexCoord >= 0) { glBindBuffer(GL_ARRAY_BUFFER, m_vbo[VBO_TEXCOORD]); glBufferData(GL_ARRAY_BUFFER, m_countElements * 2 * sizeof(GLfloat), m_arrTexCoord, GL_STATIC_DRAW); glVertexAttribPointer(locAttrTexCoord, 2, GL_FLOAT, GL_FALSE, 0, 0); CGLInfo::CheckError("VA3 initialized ?"); glEnableVertexAttribArray(locAttrTexCoord); CGLInfo::CheckError("VA3 initialized"); } if (locAttrTangent >= 0) { glBindBuffer(GL_ARRAY_BUFFER, m_vbo[VBO_TANGENT]); glBufferData(GL_ARRAY_BUFFER, m_countElements * 2 * sizeof(GLfloat), m_arrTexCoord, GL_STATIC_DRAW); glVertexAttribPointer(locAttrTexCoord, 2, GL_FLOAT, GL_FALSE, 0, 0); CGLInfo::CheckError("VA3 initialized ?"); glEnableVertexAttribArray(locAttrTexCoord); CGLInfo::CheckError("VA3 initialized"); } if (locAttrTexCoord >= 0) { glBindBuffer(GL_ARRAY_BUFFER, m_vbo[idx++]); glBufferData(GL_ARRAY_BUFFER, m_countElements * 2 * sizeof(GLfloat), m_arrTexCoord, GL_STATIC_DRAW); glVertexAttribPointer(locAttrTexCoord, 2, GL_FLOAT, GL_FALSE, 0, 0); CGLInfo::CheckError("VA3 initialized ?"); glEnableVertexAttribArray(locAttrTexCoord); CGLInfo::CheckError("VA3 initialized"); } */ if (found) { glGenBuffers(1, &m_vboIdx); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vboIdx); glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_countIdx * sizeof(GLuint), m_arrIdx, GL_STATIC_DRAW); } cleanupBuffers(); glBindVertexArray(0); return true; }