0

I'm following the http://opengl-tutorials.org tutorial series, and came up with a very basic code for drawing a white triangle on screen, but I can't seem to get it to work.

I've compiled glfw without any additional options using appleshell's answer here: OpenGL 3.3/4.1 on Mac OSX 10.9 using GLFW library

I created a simple source code based on the site instructions:

#include <stdio.h>
#include <stdlib.h>

#include <glfw3.h>

// Need gl3.h for glGenVertexArrays() and glBindVertexArray()
#include <OpenGL/gl3.h>

// An array of 3 vectors which represents 3 vertices
static const GLfloat g_vertex_buffer_data[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

#define printGlErr(func) err = glGetError(); if (err) fprintf(stderr, func " error: %u at line %d\n", err, __LINE__);
GLuint err;

int main(int argc, const char * argv[]) {
    if (!glfwInit()) {
        fprintf( stderr, "Failed to initialize GLFW\n" );
        return -1;
    }

    glfwWindowHint(GLFW_SAMPLES, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //We don't want the old OpenGL

    // Open a window and create its OpenGL context
    GLFWwindow* window;
    window = glfwCreateWindow(1024, 768, "Triangle", NULL, NULL);
    if (window == NULL) {
        fprintf(stderr, "Failed to open GLFW window.\n");
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);

    // Ensure we can capture the escape key being pressed below
    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

    // Init stuff
    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);

    // This will identify our vertex buffer
    GLuint vertexbuffer;

    // Generate 1 buffer, put the resulting identifier in vertexbuffer
    glGenBuffers(1, &vertexbuffer);
    printGlErr("glGenBuffers()");

    // The following commands will talk about our 'vertexbuffer' buffer
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    printGlErr("glBindBuffer()");

    // Give our vertices to OpenGL.
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
    printGlErr("glBufferData()");

    do {
        // Draw stuff
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
        glVertexAttribPointer(
                              0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
                              3,                  // size
                              GL_FLOAT,           // type
                              GL_FALSE,           // normalized?
                              0,                  // stride
                              (void*)0            // array buffer offset
                              );
        printGlErr("glVertexAttribPointer()");

        glDrawArrays(GL_TRIANGLES, 0, 3);
        printGlErr("glDrawArrays()");

        glDisableVertexAttribArray(0);
        printGlErr("glDisableVertexAttribArray()");

        // Swap buffers
        glfwSwapBuffers(window);
        glfwPollEvents();
    } while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == 0); // Check if the ESC key was pressed or the window was closed

    printf("Goodbye!\n");
    return(0);
}

I can't seem to get the code to work. I'm getting a GL_INVALID_OPERATION on the glDrawArrays() function call.

The code renders a black window on Mavericks and on Yosemite. This is my hardware specs: http://support.apple.com/kb/SP653

It does not crash, it exits on ESC, but nothing else happens (other than spamming the error code on the console). The results are the same using any of the 2 available video boards.

Also, I'm compiling the source code using the following line on terminal: gcc main.c -o triangle -framework OpenGl -framework Cocoa -framework IOKit -framework CoreVideo -I../glfw/include/GLFW -L../glfw/src -lglfw3

Community
  • 1
  • 1
Sergio Moura
  • 4,888
  • 1
  • 21
  • 38
  • Yeah... My goal is a white triangle (so, no shaders), and I'm using VAO as suggested on Reto's (Edit: YOUR) answer... So... Similar, but not the same. – Sergio Moura Aug 04 '14 at 18:06
  • 3
    But you **do** need a shader with the Core Profile. The fixed pipeline is not supported anymore, and writing a GLSL shader is required. Unless you use a higher level toolkit that handles that for you. The shaders can be very simple if you just want to produce a solid color, but they are still needed. – Reto Koradi Aug 04 '14 at 18:10
  • Additional help: http://stackoverflow.com/questions/3746376/opengl-3-2-core-profile-guide – indiv Aug 04 '14 at 18:11
  • Added shaders. It worked. Thank you, Reto. – Sergio Moura Aug 04 '14 at 18:31

0 Answers0