diff --git a/modules/Archimedes-Modules/TestTriangle/TestTriangle.cpp b/modules/Archimedes-Modules/TestTriangle/TestTriangle.cpp index b144332..890b7e8 100644 --- a/modules/Archimedes-Modules/TestTriangle/TestTriangle.cpp +++ b/modules/Archimedes-Modules/TestTriangle/TestTriangle.cpp @@ -126,79 +126,95 @@ void TestTriangle::onLoad() { //////////////////////gl std::cout << "glfw setup" << std::endl; - - vs = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vs, 1, &vertexShaderSource, NULL); - glCompileShader(vs); - glGetShaderiv(vs, GL_COMPILE_STATUS, &success); - - if(!success) { - std::cout << "shader linking failed!" << std::endl; + if(glewInit() != GLEW_OK) { + std::cout << "glew is not ok!" << std::endl; std::abort(); - }; + } + ///////////////////////////////NUCLEAR + + // build and compile our shader program + // ------------------------------------ + // vertex shader + unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); + glCompileShader(vertexShader); + // check for shader compile errors + int success; + char infoLog[512]; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + if (!success) + { + glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; + } + // fragment shader + unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(fragmentShader); + // check for shader compile errors + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); + if (!success) + { + glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; + } + // link shaders + shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + // check for linking errors + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; + } + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); - fs = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fs, 1, &fragShaderSource, NULL); - glCompileShader(fs); + // set up vertex data (and buffer(s)) and configure vertex attributes + // ------------------------------------------------------------------ - glGetShaderiv(fs, GL_COMPILE_STATUS, &success); + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + // bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s). + glBindVertexArray(VAO); - if(!success) { - std::cout << "shader linking failed!" << std::endl; - std::abort(); - }; - - - program = glCreateProgram(); - - glAttachShader(program, vs); - glAttachShader(program, fs); - glLinkProgram(program); - - glGetProgramiv(program, GL_LINK_STATUS, &success); - - if(!success) { - std::cout << "shader linking failed!" << std::endl; - std::abort(); - }; - - std::cout << "shader program complete" << std::endl; - - glDeleteShader(vs); - glDeleteShader(fs); - - std::cout << "shaders destroyed" << std::endl; - - glGenBuffers(1, &vbo); - glGenVertexArrays(1, &vao); - - glBindVertexArray(vao); - - glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + 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); - std::cout << "load success" << std::endl; + // uncomment this call to draw in wireframe polygons. + //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + } void TestTriangle::run() { - - std::cout << "run" << std::endl; - glClearColor(0.2, 0.2, 0.4, 1); + // render + // ------ + glClearColor(0.2f, 0.2f, 0.4f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - glUseProgram(this->program); - glBindVertexArray(this->vao); - // 3. now draw the object - int f = 0, c = 3; - glMultiDrawArrays(GL_TRIANGLES, &f, &c, 1); - //glBindVertexArray(0); + // draw our first triangle + glUseProgram(shaderProgram); + glBindVertexArray(VAO); // 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(w); glfwPollEvents(); } diff --git a/modules/Archimedes-Modules/TestTriangle/TestTriangle.h b/modules/Archimedes-Modules/TestTriangle/TestTriangle.h index b70a24b..36d8f1e 100644 --- a/modules/Archimedes-Modules/TestTriangle/TestTriangle.h +++ b/modules/Archimedes-Modules/TestTriangle/TestTriangle.h @@ -29,30 +29,27 @@ class TestTriangle : public Archimedes::Module { Archimedes::WindowData data; - float vertices[3 * 3] = { - -0.5f, -0.5f, 0.0f, - 0.5f, -0.5f, 0.0f, - 0.0f, 0.5f, 0.0f - }; - - unsigned int vao, vbo, vs, fs, program; - int success; - - const char *vertexShaderSource = - "#version 330 core\n" - "layout (location = 0) in vec3 aPos;\n" - "void main() {\n" - " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" - "}\0"; - - const char *fragShaderSource = - "#version 330 core\n" - "out vec4 FragColor;\n" - "void main() {\n" - " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" - "}\0"; - + const char *vertexShaderSource = "#version 330 core\n" + "layout (location = 0) in vec3 aPos;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" + "}\0"; + const char *fragmentShaderSource = "#version 330 core\n" + "out vec4 FragColor;\n" + "void main()\n" + "{\n" + " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" + "}\n\0"; + unsigned int shaderProgram; + unsigned int VBO, VAO; + + float vertices[9] = { + -0.5f, -0.5f, 0.0f, // left + 0.5f, -0.5f, 0.0f, // right + 0.0f, 0.5f, 0.0f // top + }; }; #ifdef TESTTRIANGLE_DYNAMIC