0

I am following an online tutorial (roughly) and although I have no errors, nothing is rendering.

Here are the important parts of my code.

initializing:

    void init()
{
    GLfloat firstTriangle[] = {
        -0.9f, -0.5f, 0.0f,  // left 
        -0.0f, -0.5f, 0.0f,  // right
        -0.45f, 0.5f, 0.0f,  // top 
    };
    GLfloat secondTriangle[] = {
        0.0f, -0.5f, 0.0f,  // left
        0.9f, -0.5f, 0.0f,  // right
        0.45f, 0.5f, 0.0f   // top 
    };
    // Set up the shaders
    buildandcomp();
    //generate VAOs/VBOs
    generateVertexArrayObjects(firstTriangle, secondTriangle);
}

Here buildandcomp():

void buildandcomp() {
    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    fragmentShaderOrange = glCreateShader(GL_FRAGMENT_SHADER); // the first fragment shader that outputs the color orange
    fragmentShaderYellow = glCreateShader(GL_FRAGMENT_SHADER); // the second fragment shader that outputs the color yellow
    shaderProgramOrange = glCreateProgram();
    shaderProgramYellow = glCreateProgram(); // the second shader program
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
    glShaderSource(fragmentShaderOrange, 1, &fragmentShader1Source, NULL);
    glCompileShader(fragmentShaderOrange);
    glShaderSource(fragmentShaderYellow, 1, &fragmentShader2Source, NULL);
    glCompileShader(fragmentShaderYellow);
    // link the first program object
    glAttachShader(shaderProgramOrange, vertexShader);
    glAttachShader(shaderProgramOrange, fragmentShaderOrange);
    glLinkProgram(shaderProgramOrange);
    // then link the second program object using a different fragment shader (but same vertex shader)
    // this is perfectly allowed since the inputs and outputs of both the vertex and fragment shaders are equally matched.
    glAttachShader(shaderProgramYellow, vertexShader);
    glAttachShader(shaderProgramYellow, fragmentShaderYellow);
    glLinkProgram(shaderProgramYellow);
}

Note that the variables were defined globally.

Here is generateVertexArrayObjects():

void generateVertexArrayObjects(GLfloat t1[], GLfloat t2[]) {
    glGenVertexArrays(2, VAOs);
    glGenBuffers(2, VBOs);
    //triangle 1
    glBindVertexArray(VAOs[0]);
    glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(t1), t1, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3* sizeof(GLfloat), (void*)0);
    glEnableVertexAttribArray(0);
    //triangle 2
    glBindVertexArray(VAOs[1]);
    glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(t2), t2, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
    glEnableVertexAttribArray(0);

    glBindVertexArray(0);
}

Here are the shaders:

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* fragmentShader1Source = "#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";
const char* fragmentShader2Source = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
"   FragColor = vec4(1.0f, 1.0f, 0.0f, 1.0f);\n"
"}\n\0";

here is my display function:

void display() {
    keyOperations();
    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

    glUseProgram(shaderProgramOrange);
    glBindVertexArray(VAOs[0]);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glUseProgram(shaderProgramYellow);
    glBindVertexArray(VAOs[1]);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glutSwapBuffers();
}

I suspect that this has something to do with my shaders, but I do not see what it could be. I'm still new to OpenGL, so I'm not sure where it is I'm going wrong. I have loaded my data, I have built and compiled my shaders, and I've displayed my triangles using these shaders. Any insight would be appreciated, thanks.

iaskdumbstuff
  • 409
  • 3
  • 16
  • 1
    https://renderdoc.org/ – tkausl Dec 08 '19 at 11:29
  • 2
    The issue is a very, very basic c/c++ issue and has nothing to do with OpenGL. Think about `sizeof(t1)` and `sizeof(t2)`. Replace it by `sizeof(GLfloat)*9`. – Rabbid76 Dec 08 '19 at 11:37
  • @Rabbid76 Thanks for the answer. There must be something I'm not understanding though. Why is the sizeof(t1) not equal to sizeof(GLfloat)*9? When I print the size of firstTriangle in my init() function, the size is 36. However, the sizeof(t1), in my VAO generator is 4. What's happening? Thanks. – iaskdumbstuff Dec 08 '19 at 11:52
  • You do not get the size of the array. You get the size of the parameter, which is a pointer to the array – Rabbid76 Dec 08 '19 at 13:29

0 Answers0