void display() { // Update of the uniform buffer { glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]); glm::mat4* Pointer = (glm::mat4*)glMapBufferRange( GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); glm::mat4 Projection = glm::perspectiveFov(45.f, 640.f, 480.f, 0.1f, 100.0f); //glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f); glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y)); glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f)); glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f)); glm::mat4 Model = glm::mat4(1.0f); *Pointer = Projection * View * Model; // Make sure the uniform buffer is uploaded glUnmapBuffer(GL_UNIFORM_BUFFER); } glBindProgramPipeline(PipelineName[program::COMPUTE]); glBindImageTexture(image::POSITION_INPUT, TextureName[texture::POSITION_INPUT], 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA32F); glBindImageTexture(image::TEXCOORD_INPUT, TextureName[texture::TEXCOORD_INPUT], 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA32F); glBindImageTexture(image::COLOR_INPUT, TextureName[texture::COLOR_INPUT], 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA32F); glBindImageTexture(image::POSITION_OUTPUT, TextureName[texture::POSITION_OUTPUT], 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F); glBindImageTexture(image::TEXCOORD_OUTPUT, TextureName[texture::TEXCOORD_OUTPUT], 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F); glBindImageTexture(image::COLOR_OUTPUT, TextureName[texture::COLOR_OUTPUT], 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F); glBindBufferBase(GL_UNIFORM_BUFFER, glf::semantic::uniform::TRANSFORM0, BufferName[buffer::TRANSFORM]); glDispatchCompute(GLuint(VertexCount), 1, 1); glViewportIndexedf(0, 0, 0, GLfloat(Window.Size.x), GLfloat(Window.Size.y)); glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f)[0]); glBindProgramPipeline(PipelineName[program::GRAPHICS]); glActiveTexture(GL_TEXTURE0 + glf::semantic::sampling::SAMPLER_DIFFUSE); glBindTexture(GL_TEXTURE_2D, TextureName[texture::DIFFUSE]); glActiveTexture(GL_TEXTURE0 + sampling::SAMPLER_POSITION); glBindTexture(GL_TEXTURE_BUFFER, TextureName[texture::POSITION_OUTPUT]); glActiveTexture(GL_TEXTURE0 + sampling::SAMPLER_TEXCOORD); glBindTexture(GL_TEXTURE_BUFFER, TextureName[texture::TEXCOORD_OUTPUT]); glActiveTexture(GL_TEXTURE0 + sampling::SAMPLER_COLOR); glBindTexture(GL_TEXTURE_BUFFER, TextureName[texture::COLOR_OUTPUT]); glBindVertexArray(VertexArrayName); glBindBufferBase(GL_UNIFORM_BUFFER, glf::semantic::uniform::TRANSFORM0, BufferName[buffer::TRANSFORM]); glDrawElementsInstancedBaseVertexBaseInstance( GL_TRIANGLES, ElementCount, GL_UNSIGNED_SHORT, GLF_BUFFER_OFFSET(0), 1, 0, 0); glf::swapBuffers(); }
bool initVertexArray() { glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, BufferName); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::TEXCOORD); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
bool initVertexArray() { // Create a dummy vertex array object where all the attribute buffers and element buffers would be attached glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, BufferName); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::TEXCOORD); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
bool initVertexArray() { glGenVertexArrays(buffer::MAX, &VertexArrayName[0]); /* glBindVertexArray(VertexArrayName[buffer::F16]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::F16]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_HALF_FLOAT, GL_FALSE, sizeof(glm::hvec2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); */ glBindVertexArray(VertexArrayName[buffer::F32]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::F32]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); glBindVertexArray(VertexArrayName[buffer::I8]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::I8]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_BYTE, GL_FALSE, sizeof(glm::u8vec2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); glBindVertexArray(VertexArrayName[buffer::I32]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::I32]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_INT, GL_FALSE, sizeof(glm::i32vec2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); glBindVertexArray(VertexArrayName[buffer::RGB10A2]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::RGB10A2]); glVertexAttribPointer(glf::semantic::attr::POSITION, 4, GL_INT_2_10_10_10_REV, GL_TRUE, sizeof(i10i10i10i2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
bool initVertexArray() { glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::VERTEX]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv3f), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::TEXCOORD, 3, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv3f), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::DRAW_ID]); glVertexAttribIPointer(glf::semantic::attr::DRAW_ID, 1, GL_UNSIGNED_INT, sizeof(glm::uint), GLF_BUFFER_OFFSET(0)); glVertexAttribDivisor(glf::semantic::attr::DRAW_ID, 1); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::TEXCOORD); glEnableVertexAttribArray(glf::semantic::attr::DRAW_ID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]); glBindVertexArray(0); return true; }
bool initVertexArray() { // Build a vertex array object glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, ArrayBufferName); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fc4f), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fc4f), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::COLOR); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
bool initVertexArray() { glf::checkError("initVertexArray 0"); // Build a vertex array object glGenVertexArrays(1, &TransformVertexArrayName); glBindVertexArray(TransformVertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, TransformArrayBufferName); glVertexAttribPointer(glf::semantic::attr::POSITION, 4, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); glf::checkError("initVertexArray 1"); // Build a vertex array object glGenVertexArrays(1, &FeedbackVertexArrayName); glBindVertexArray(FeedbackVertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, FeedbackArrayBufferName); glVertexAttribPointer(glf::semantic::attr::POSITION, 4, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v4fc4f), 0); glVertexAttribPointer(glf::semantic::attr::COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v4fc4f), GLF_BUFFER_OFFSET(sizeof(glm::vec4))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::COLOR); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
bool initVertexArray() { bool Validated(true); glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::VERTEX]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::TEXCOORD); glBindVertexArray(0); return Validated; }
bool initVertexArray() { glGenVertexArrays(BUFFER_MAX, VertexArrayName); glBindVertexArray(VertexArrayName[BUFFER_F16]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[BUFFER_F16]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_HALF_FLOAT, GL_FALSE, sizeof(glm::hvec2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); glBindVertexArray(VertexArrayName[BUFFER_F32]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[BUFFER_F32]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); glBindVertexArray(VertexArrayName[BUFFER_I8]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[BUFFER_I8]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_BYTE, GL_FALSE, sizeof(glm::u8vec2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); glBindVertexArray(VertexArrayName[BUFFER_I32]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[BUFFER_I32]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_INT, GL_FALSE, sizeof(glm::i32vec2), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
bool initVertexArray() { bool Validated(true); glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glObjectLabel(GL_VERTEX_ARRAY, VertexArrayName, -1, "Vertex array object"); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::VERTEX]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::TEXCOORD); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]); glBindVertexArray(0); return Validated; }
void display() { // Compute the MVP (Model View Projection matrix) glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 1000.0f); glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y)); glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f)); glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f)); glm::mat4 Model = glm::mat4(1.0f); glm::mat4 MVP = Projection * View * Model; glViewport(0, 0, Window.Size.x, Window.Size.y); glScissor(0, 0, Window.Size.x, Window.Size.y); glClearColor(1.0f, 0.5f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // Bind the program for use glUseProgram(ProgramName); glUniformMatrix4fv(UniformMVP, 1, GL_FALSE, &MVP[0][0]); glUniform1i(UniformDiffuse, 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, Texture2DName); glBindBuffer(GL_ARRAY_BUFFER, BufferName); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(vertex), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::TEXCOORD); for(std::size_t Index = 0; Index < viewport::MAX; ++Index) { glScissor( Viewport[Index].x, Viewport[Index].y, Viewport[Index].z, Viewport[Index].w); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, MinFilter[Index]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, MagFilter[Index]); glDrawArrays(GL_TRIANGLES, 0, VertexCount); } glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0); glf::checkError("display"); glf::swapBuffers(); }
bool initVertexArray() { glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, ArrayBufferName); glVertexAttribPointer(glf::semantic::attr::POSITION + 0, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fc4f), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::POSITION + 1, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fc4f), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fc4f), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION + 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION + 1); glEnableVertexAttribArray(glf::semantic::attr::COLOR); glBindVertexArray(0); std::vector<glf::vertexattrib> Valid(16); Valid[glf::semantic::attr::POSITION + 0] = glf::vertexattrib(GL_TRUE, 0, 2, sizeof(glf::vertex_v2fc4f), GL_FLOAT, GL_FALSE, GL_FALSE, GL_FALSE, 0, NULL); Valid[glf::semantic::attr::POSITION + 1] = glf::vertexattrib(GL_TRUE, 0, 2, sizeof(glf::vertex_v2fc4f), GL_FLOAT, GL_FALSE, GL_FALSE, GL_FALSE, 0, NULL); Valid[glf::semantic::attr::COLOR] = glf::vertexattrib(GL_TRUE, 0, 4, sizeof(glf::vertex_v2fc4f), GL_FLOAT, GL_FALSE, GL_FALSE, GL_FALSE, 0, GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glf::validateVAO42(VertexArrayName, Valid); return true; }
bool initVertexArray() { glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::F64]); glVertexAttribLPointer(glf::semantic::attr::POSITION, 3, GL_DOUBLE, sizeof(glm::dvec3), GLF_BUFFER_OFFSET(0)); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
bool initVertexArray() { glGenVertexArrays(program::MAX, &VertexArrayName[0]); glBindVertexArray(VertexArrayName[program::TEXTURE]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::VERTEX]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::TEXCOORD); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]); glBindVertexArray(0); glBindVertexArray(VertexArrayName[program::SPLASH]); glBindVertexArray(0); return true; }
bool initVertexArray() { glGenVertexArrays(1, &VertexArrayName); glBindVertexArray(VertexArrayName); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::VERTEX]); glVertexAttribPointer(glf::semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fc4ub), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(glf::vertex_v2fc4ub), GLF_BUFFER_OFFSET(sizeof(glm::vec2))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::COLOR); glBindVertexArray(0); return glf::checkError("initVertexArray"); }
bool initVertexArray() { glGenVertexArrays(program::MAX, &VertexArrayName[0]); glBindVertexArray(VertexArrayName[program::RENDER]); glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::VERTEX]); glVertexAttribPointer(glf::semantic::attr::POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v3fv4u8), GLF_BUFFER_OFFSET(0)); glVertexAttribPointer(glf::semantic::attr::COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(glf::vertex_v3fv4u8), GLF_BUFFER_OFFSET(sizeof(glm::vec3))); glBindBuffer(GL_ARRAY_BUFFER, 0); glEnableVertexAttribArray(glf::semantic::attr::POSITION); glEnableVertexAttribArray(glf::semantic::attr::COLOR); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]); glBindVertexArray(0); return true; }