From 93f4f716c04003e27f22c77192a39135d1af2e15 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Sun, 22 Oct 2023 19:42:14 +0200 Subject: [PATCH] triangle --- src/graphics.cpp | 69 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 59 insertions(+), 10 deletions(-) diff --git a/src/graphics.cpp b/src/graphics.cpp index ff1c321..ed1ec4e 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -106,7 +106,6 @@ ShaderProgram::ShaderProgram(Base base, string vertexSource, } // finalizing our setup - glUseProgram(this->program); glDeleteShader(this->vertex); glDeleteShader(this->frag); } @@ -117,29 +116,79 @@ ShaderProgram::ShaderProgram(Base base, string vertexSource, */ int ShaderProgram::run(GLFWwindow *window) { if (this->base == Triangle) { + // set up vertex data (and buffer(s)) and configure vertex attributes + // ------------------------------------------------------------------ float vTriangle[] = { - -0.5f, -0.5f, 0.0f, // opengl - 0.5f, -0.5f, 0.0f, // treats 3d arrays - 0.0f, 0.5f, 0.0f // as large 1d arrays + -0.5f, -0.5f, 0.0f, // left + 0.5f, -0.5f, 0.0f, // right + 0.0f, 0.5f, 0.0f // top }; - unsigned int oTriangle; - glGenBuffers(1, &oTriangle); - glBindBuffer(GL_ARRAY_BUFFER, oTriangle); + + unsigned int VBOTriangle, VAOTriangle; + glGenVertexArrays(1, &VAOTriangle); + glGenBuffers(1, &VBOTriangle); + // bind the Vertex Array Object first, then bind and set vertex buffer(s), + // and then configure vertex attributes(s). + glBindVertexArray(VAOTriangle); + + glBindBuffer(GL_ARRAY_BUFFER, VBOTriangle); glBufferData(GL_ARRAY_BUFFER, sizeof(vTriangle), vTriangle, GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), + (void *)0); + glEnableVertexAttribArray(0); + + // note that this is allowed, the call to glVertexAttribPointer registered + // VBO as the vertex attribute's bound vertex buffer object so afterwards we + // can safely unbind + glBindBuffer(GL_ARRAY_BUFFER, 0); + + // You can unbind the VAO afterwards so other VAO calls won't accidentally + // modify this VAO, but this rarely happens. Modifying other VAOs requires a + // call to glBindVertexArray anyways so we generally don't unbind VAOs (nor + // VBOs) when it's not directly necessary. + glBindVertexArray(0); + + // uncomment this call to draw in wireframe polygons. + // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); while (!glfwWindowShouldClose(window)) { + // input + // ----- processInput(window); - glClearColor(0.9f, 0.3f, 0.3f, 1.0f); + // render + // ------ + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); + // draw our first triangle + glUseProgram(this->program); + glBindVertexArray(VAOTriangle); // seeing as we only have a single VAO there's no + // need to bind it every time, but we'll do so to + // keep things a bit more organized + glDrawArrays(GL_TRIANGLES, 0, 3); + // glBindVertexArray(0); // no need to unbind it every time + + // glfw: swap buffers and poll IO events (keys pressed/released, mouse + // moved etc.) + // ------------------------------------------------------------------------------- glfwSwapBuffers(window); glfwPollEvents(); } + // optional: de-allocate all resources once they've outlived their purpose: + // ------------------------------------------------------------------------ + glDeleteVertexArrays(1, &VAOTriangle); + glDeleteBuffers(1, &VBOTriangle); + glDeleteProgram(this->program); + + // glfw: terminate, clearing all previously allocated GLFW resources. + // ------------------------------------------------------------------ + glfwTerminate(); return 0; } else // Empty { - - return 0; + // use the compiled shader + glUseProgram(this->program); while (!glfwWindowShouldClose(window)) { processInput(window);