Skip to main content
added 190 characters in body
Source Link
Adrian
  • 677
  • 8
  • 18

EDIT 2 The problem was that I believed the vertex shader runs for every point in the square, but instead it only run for the 4 vertex specified. Now the problem is... How can I fix it?

EDIT 2 The problem was that I believed the vertex shader runs for every point in the square, but instead it only run for the 4 vertex specified. Now the problem is... How can I fix it?

added 5 characters in body
Source Link
Adrian
  • 677
  • 8
  • 18

EDIT The following link is a youtube video that will show you how the square gets transformed with different Z values:

#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>

#include <GLFW/glfw3.h>

int main()
{
    //INIT LIBRARIES
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    GLFWwindow* window = glfwCreateWindow(400 ,400 , "", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewExperimental = GL_TRUE;
    glewInit();
    glViewport(0, 0, 400, 400);



    //SHADERS
    const GLchar* VERTEX_SHADER_SOURCE =
        "#version 330 core                      \n"
        "                                       \n"
        "layout (location = 0) in vec3 position;\n"
        "layout (location = 1) in vec3 myColor; \n"
        ""
        "uniform float movement;"
        "                                       \n"
        "out vec3 MyColor;                      \n"
        "                                       \n"
        "void main()                            \n"
        "{                                      \n"
        "   MyColor = myColor;                  \n"
        "   vec3 v = position;                  \n"
        "   v.z = v.z - movement;               \n"
        "   v.x = v.x/v.z;                      \n"
        "   v.y = v.y/v.z;                      \n"
        "   gl_Position = vec4(v, 1.0f);        \n"
        "}                                      \n";

    const GLchar* FRAGMENT_SHADER_SOURCE =
        "#version 330 core              \n"
        "                               \n"
        "in vec3 MyColor;               \n"
        "                               \n"
        "out vec4 color;                \n"
        "                               \n"
        "void main()                    \n"
        "{                              \n"
        "   color = vec4(MyColor,1.0f); \n"
        "}                              \n";

    GLuint program;
    GLuint vertex, fragment;

    vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &VERTEX_SHADER_SOURCE, NULL);
    glCompileShader(vertex);

    fragment = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment, 1, &FRAGMENT_SHADER_SOURCE, NULL);
    glCompileShader(fragment);

    program = glCreateProgram();
    glAttachShader(program, vertex);
    glAttachShader(program, fragment);
    glLinkProgram(program);

    glDeleteShader(vertex);
    glDeleteShader(fragment);

    GLfloat uniform = glGetUniformLocation(program, "movement");
    glUseProgram(program);



    //VAOs & VBOs
    GLfloat vertices[] =
//Uncomment one of the following set of vertices to see the program in action
//The last one produces the strange behaviour
    /*{
            //This set will show you a square occuping the full window
            -0.5f, -0.5f,  0.5f,        1.0f, 0.0f, 0.0f,
            -0.5f,  0.5f,  0.5f,        0.0f, 1.0f, 0.0f,
             0.5f, -0.5f,  0.5f,        0.0f, 0.0f, 1.0f,
             0.5f,  0.5f,  0.5f,        1.0f, 1.0f, 0.0f
    };/**/
    {
            //This set draw a square at the bottom
             0.25f, -0.25f,  1.0f,      1.0f, 0.0f, 0.0f,
            -0.25f, -0.25f,  1.0f,      0.0f, 1.0f, 0.0f,
             0.25f, -0.25f,  1.5f,      0.0f, 0.0f, 1.0f,
            -0.25f, -0.25f,  1.5f,      1.0f, 1.0f, 0.0f
    };/**/
    /*{
            //This set draw the square to the left (Z is negative therefore z/x is also negative and the x value is inversed)
            -0.5f, -0.5f, -0.5f,        1.0f, 0.0f, 0.0f,
            -0.5f,  0.5f, -0.5f,        0.0f, 1.0f, 0.0f,
            -0.5f, -0.5f, -1.0f,        0.0f, 0.0f, 1.0f,
            -0.5f,  0.5f, -1.0f,        1.0f, 1.0f, 0.0f
    };/**/
    /*{
            //This set should not draw anything because y = y/z -> y = -0.5/[-0.25,+0.25] -> y = (-inf,-4] U [4,inf)
            //[-0.25,+0.25] means any value between -0.25 and 0.25
            //(-inf,-4] U [4,inf) means any value that is not between -4 and 4
            //Whathever value 'y' gets is out of the range [-1,1] so it should not be visible, but instead a figure is drawn causing the strange behaviour
             0.5f, -0.5f, -0.25f,       1.0f, 0.0f, 0.0f,
            -0.5f, -0.5f, -0.25f,       0.0f, 1.0f, 0.0f,
             0.5f, -0.5f,  0.25f,       0.0f, 0.0f, 1.0f,
            -0.5f, -0.5f,  0.25f,       1.0f, 1.0f, 0.0f
    };/**/

    GLuint VAO, VBO;
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3*sizeof(GLfloat)));
    glEnableVertexAttribArray(1);



    //DRAW
    GLfloat movement = 0.0f;
    glfwSetTime(0.0);

    while (!glfwWindowShouldClose(window))
    {
        if(movement >= 2.5f)
            glfwSetTime(0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        movement = glfwGetTime()/4;
        glUniform1f(uniform, movement);
        glDrawArrays(GL_TRIANGLE_STRIP, 0,4);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }



    //END
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glfwTerminate();

    return 0;
}

EDIT The following link is a youtube video will show you how the square gets transformed with different Z values:

#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>

#include <GLFW/glfw3.h>

int main()
{
    //INIT LIBRARIES
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    GLFWwindow* window = glfwCreateWindow(400 ,400 , "", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewExperimental = GL_TRUE;
    glewInit();
    glViewport(0, 0, 400, 400);



    //SHADERS
    const GLchar* VERTEX_SHADER_SOURCE =
        "#version 330 core                      \n"
        "                                       \n"
        "layout (location = 0) in vec3 position;\n"
        "layout (location = 1) in vec3 myColor; \n"
        ""
        "uniform float movement;"
        "                                       \n"
        "out vec3 MyColor;                      \n"
        "                                       \n"
        "void main()                            \n"
        "{                                      \n"
        "   MyColor = myColor;                  \n"
        "   vec3 v = position;                  \n"
        "   v.z = v.z - movement;               \n"
        "   v.x = v.x/v.z;                      \n"
        "   v.y = v.y/v.z;                      \n"
        "   gl_Position = vec4(v, 1.0f);        \n"
        "}                                      \n";

    const GLchar* FRAGMENT_SHADER_SOURCE =
        "#version 330 core              \n"
        "                               \n"
        "in vec3 MyColor;               \n"
        "                               \n"
        "out vec4 color;                \n"
        "                               \n"
        "void main()                    \n"
        "{                              \n"
        "   color = vec4(MyColor,1.0f); \n"
        "}                              \n";

    GLuint program;
    GLuint vertex, fragment;

    vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &VERTEX_SHADER_SOURCE, NULL);
    glCompileShader(vertex);

    fragment = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment, 1, &FRAGMENT_SHADER_SOURCE, NULL);
    glCompileShader(fragment);

    program = glCreateProgram();
    glAttachShader(program, vertex);
    glAttachShader(program, fragment);
    glLinkProgram(program);

    glDeleteShader(vertex);
    glDeleteShader(fragment);

    GLfloat uniform = glGetUniformLocation(program, "movement");
    glUseProgram(program);



    //VAOs & VBOs
    GLfloat vertices[] =
//Uncomment one of the following set of vertices to see the program in action
//The last one produces the strange behaviour
    /*{
            //This set will show you a square occuping the full window
            -0.5f, -0.5f,  0.5f,        1.0f, 0.0f, 0.0f,
            -0.5f,  0.5f,  0.5f,        0.0f, 1.0f, 0.0f,
             0.5f, -0.5f,  0.5f,        0.0f, 0.0f, 1.0f,
             0.5f,  0.5f,  0.5f,        1.0f, 1.0f, 0.0f
    };/**/
    {
            //This set draw a square at the bottom
             0.25f, -0.25f,  1.0f,      1.0f, 0.0f, 0.0f,
            -0.25f, -0.25f,  1.0f,      0.0f, 1.0f, 0.0f,
             0.25f, -0.25f,  1.5f,      0.0f, 0.0f, 1.0f,
            -0.25f, -0.25f,  1.5f,      1.0f, 1.0f, 0.0f
    };/**/
    /*{
            //This set draw the square to the left (Z is negative therefore z/x is also negative and the x value is inversed)
            -0.5f, -0.5f, -0.5f,        1.0f, 0.0f, 0.0f,
            -0.5f,  0.5f, -0.5f,        0.0f, 1.0f, 0.0f,
            -0.5f, -0.5f, -1.0f,        0.0f, 0.0f, 1.0f,
            -0.5f,  0.5f, -1.0f,        1.0f, 1.0f, 0.0f
    };/**/
    /*{
            //This set should not draw anything because y = y/z -> y = -0.5/[-0.25,+0.25] -> y = (-inf,-4] U [4,inf)
            //[-0.25,+0.25] means any value between -0.25 and 0.25
            //(-inf,-4] U [4,inf) means any value that is not between -4 and 4
            //Whathever value 'y' gets is out of the range [-1,1] so it should not be visible, but instead a figure is drawn causing the strange behaviour
             0.5f, -0.5f, -0.25f,       1.0f, 0.0f, 0.0f,
            -0.5f, -0.5f, -0.25f,       0.0f, 1.0f, 0.0f,
             0.5f, -0.5f,  0.25f,       0.0f, 0.0f, 1.0f,
            -0.5f, -0.5f,  0.25f,       1.0f, 1.0f, 0.0f
    };/**/

    GLuint VAO, VBO;
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3*sizeof(GLfloat)));
    glEnableVertexAttribArray(1);



    //DRAW
    GLfloat movement = 0.0f;
    glfwSetTime(0.0);

    while (!glfwWindowShouldClose(window))
    {
        if(movement >= 2.5f)
            glfwSetTime(0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        movement = glfwGetTime()/4;
        glUniform1f(uniform, movement);
        glDrawArrays(GL_TRIANGLE_STRIP, 0,4);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }



    //END
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glfwTerminate();

    return 0;
}

EDIT The following link is a youtube video that will show you how the square gets transformed with different Z values:

#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>

#include <GLFW/glfw3.h>

int main()
{
    //INIT LIBRARIES
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    GLFWwindow* window = glfwCreateWindow(400 ,400 , "", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewExperimental = GL_TRUE;
    glewInit();
    glViewport(0, 0, 400, 400);



    //SHADERS
    const GLchar* VERTEX_SHADER_SOURCE =
        "#version 330 core                      \n"
        "                                       \n"
        "layout (location = 0) in vec3 position;\n"
        "layout (location = 1) in vec3 myColor; \n"
        ""
        "uniform float movement;"
        "                                       \n"
        "out vec3 MyColor;                      \n"
        "                                       \n"
        "void main()                            \n"
        "{                                      \n"
        "   MyColor = myColor;                  \n"
        "   vec3 v = position;                  \n"
        "   v.z = v.z - movement;               \n"
        "   v.x = v.x/v.z;                      \n"
        "   v.y = v.y/v.z;                      \n"
        "   gl_Position = vec4(v, 1.0f);        \n"
        "}                                      \n";

    const GLchar* FRAGMENT_SHADER_SOURCE =
        "#version 330 core              \n"
        "                               \n"
        "in vec3 MyColor;               \n"
        "                               \n"
        "out vec4 color;                \n"
        "                               \n"
        "void main()                    \n"
        "{                              \n"
        "   color = vec4(MyColor,1.0f); \n"
        "}                              \n";

    GLuint program;
    GLuint vertex, fragment;

    vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &VERTEX_SHADER_SOURCE, NULL);
    glCompileShader(vertex);

    fragment = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment, 1, &FRAGMENT_SHADER_SOURCE, NULL);
    glCompileShader(fragment);

    program = glCreateProgram();
    glAttachShader(program, vertex);
    glAttachShader(program, fragment);
    glLinkProgram(program);

    glDeleteShader(vertex);
    glDeleteShader(fragment);

    GLfloat uniform = glGetUniformLocation(program, "movement");
    glUseProgram(program);



    //VAOs & VBOs
    GLfloat vertices[] =
    {
             0.25f, -0.25f,  1.0f,      1.0f, 0.0f, 0.0f,
            -0.25f, -0.25f,  1.0f,      0.0f, 1.0f, 0.0f,
             0.25f, -0.25f,  1.5f,      0.0f, 0.0f, 1.0f,
            -0.25f, -0.25f,  1.5f,      1.0f, 1.0f, 0.0f
    };

    GLuint VAO, VBO;
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3*sizeof(GLfloat)));
    glEnableVertexAttribArray(1);



    //DRAW
    GLfloat movement = 0.0f;
    glfwSetTime(0.0);

    while (!glfwWindowShouldClose(window))
    {
        if(movement >= 2.5f)
            glfwSetTime(0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        movement = glfwGetTime()/4;
        glUniform1f(uniform, movement);
        glDrawArrays(GL_TRIANGLE_STRIP, 0,4);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }



    //END
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glfwTerminate();

    return 0;
}
added 4803 characters in body
Source Link
Adrian
  • 677
  • 8
  • 18

EDIT The following link is a youtube video will show you how the square gets transformed with different Z values:

https://youtu.be/S4TsfZjCIbM

And this is the code that I used for the video:

#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>

#include <GLFW/glfw3.h>

int main()
{
    //INIT LIBRARIES
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    GLFWwindow* window = glfwCreateWindow(400 ,400 , "", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewExperimental = GL_TRUE;
    glewInit();
    glViewport(0, 0, 400, 400);



    //SHADERS
    const GLchar* VERTEX_SHADER_SOURCE =
        "#version 330 core                      \n"
        "                                       \n"
        "layout (location = 0) in vec3 position;\n"
        "layout (location = 1) in vec3 myColor; \n"
        ""
        "uniform float movement;"
        "                                       \n"
        "out vec3 MyColor;                      \n"
        "                                       \n"
        "void main()                            \n"
        "{                                      \n"
        "   MyColor = myColor;                  \n"
        "   vec3 v = position;                  \n"
        "   v.z = v.z - movement;               \n"
        "   v.x = v.x/v.z;                      \n"
        "   v.y = v.y/v.z;                      \n"
        "   gl_Position = vec4(v, 1.0f);        \n"
        "}                                      \n";

    const GLchar* FRAGMENT_SHADER_SOURCE =
        "#version 330 core              \n"
        "                               \n"
        "in vec3 MyColor;               \n"
        "                               \n"
        "out vec4 color;                \n"
        "                               \n"
        "void main()                    \n"
        "{                              \n"
        "   color = vec4(MyColor,1.0f); \n"
        "}                              \n";

    GLuint program;
    GLuint vertex, fragment;

    vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &VERTEX_SHADER_SOURCE, NULL);
    glCompileShader(vertex);

    fragment = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment, 1, &FRAGMENT_SHADER_SOURCE, NULL);
    glCompileShader(fragment);

    program = glCreateProgram();
    glAttachShader(program, vertex);
    glAttachShader(program, fragment);
    glLinkProgram(program);

    glDeleteShader(vertex);
    glDeleteShader(fragment);

    GLfloat uniform = glGetUniformLocation(program, "movement");
    glUseProgram(program);



    //VAOs & VBOs
    GLfloat vertices[] =
//Uncomment one of the following set of vertices to see the program in action
//The last one produces the strange behaviour
    /*{
            //This set will show you a square occuping the full window
            -0.5f, -0.5f,  0.5f,        1.0f, 0.0f, 0.0f,
            -0.5f,  0.5f,  0.5f,        0.0f, 1.0f, 0.0f,
             0.5f, -0.5f,  0.5f,        0.0f, 0.0f, 1.0f,
             0.5f,  0.5f,  0.5f,        1.0f, 1.0f, 0.0f
    };/**/
    {
            //This set draw a square at the bottom
             0.25f, -0.25f,  1.0f,      1.0f, 0.0f, 0.0f,
            -0.25f, -0.25f,  1.0f,      0.0f, 1.0f, 0.0f,
             0.25f, -0.25f,  1.5f,      0.0f, 0.0f, 1.0f,
            -0.25f, -0.25f,  1.5f,      1.0f, 1.0f, 0.0f
    };/**/
    /*{
            //This set draw the square to the left (Z is negative therefore z/x is also negative and the x value is inversed)
            -0.5f, -0.5f, -0.5f,        1.0f, 0.0f, 0.0f,
            -0.5f,  0.5f, -0.5f,        0.0f, 1.0f, 0.0f,
            -0.5f, -0.5f, -1.0f,        0.0f, 0.0f, 1.0f,
            -0.5f,  0.5f, -1.0f,        1.0f, 1.0f, 0.0f
    };/**/
    /*{
            //This set should not draw anything because y = y/z -> y = -0.5/[-0.25,+0.25] -> y = (-inf,-4] U [4,inf)
            //[-0.25,+0.25] means any value between -0.25 and 0.25
            //(-inf,-4] U [4,inf) means any value that is not between -4 and 4
            //Whathever value 'y' gets is out of the range [-1,1] so it should not be visible, but instead a figure is drawn causing the strange behaviour
             0.5f, -0.5f, -0.25f,       1.0f, 0.0f, 0.0f,
            -0.5f, -0.5f, -0.25f,       0.0f, 1.0f, 0.0f,
             0.5f, -0.5f,  0.25f,       0.0f, 0.0f, 1.0f,
            -0.5f, -0.5f,  0.25f,       1.0f, 1.0f, 0.0f
    };/**/

    GLuint VAO, VBO;
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3*sizeof(GLfloat)));
    glEnableVertexAttribArray(1);



    //DRAW
    GLfloat movement = 0.0f;
    glfwSetTime(0.0);

    while (!glfwWindowShouldClose(window))
    {
        if(movement >= 2.5f)
            glfwSetTime(0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        movement = glfwGetTime()/4;
        glUniform1f(uniform, movement);
        glDrawArrays(GL_TRIANGLE_STRIP, 0,4);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }



    //END
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glfwTerminate();

    return 0;
}

EDIT The following link is a youtube video will show you how the square gets transformed with different Z values:

https://youtu.be/S4TsfZjCIbM

And this is the code that I used for the video:

#include <iostream>

#define GLEW_STATIC
#include <GL/glew.h>

#include <GLFW/glfw3.h>

int main()
{
    //INIT LIBRARIES
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    GLFWwindow* window = glfwCreateWindow(400 ,400 , "", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewExperimental = GL_TRUE;
    glewInit();
    glViewport(0, 0, 400, 400);



    //SHADERS
    const GLchar* VERTEX_SHADER_SOURCE =
        "#version 330 core                      \n"
        "                                       \n"
        "layout (location = 0) in vec3 position;\n"
        "layout (location = 1) in vec3 myColor; \n"
        ""
        "uniform float movement;"
        "                                       \n"
        "out vec3 MyColor;                      \n"
        "                                       \n"
        "void main()                            \n"
        "{                                      \n"
        "   MyColor = myColor;                  \n"
        "   vec3 v = position;                  \n"
        "   v.z = v.z - movement;               \n"
        "   v.x = v.x/v.z;                      \n"
        "   v.y = v.y/v.z;                      \n"
        "   gl_Position = vec4(v, 1.0f);        \n"
        "}                                      \n";

    const GLchar* FRAGMENT_SHADER_SOURCE =
        "#version 330 core              \n"
        "                               \n"
        "in vec3 MyColor;               \n"
        "                               \n"
        "out vec4 color;                \n"
        "                               \n"
        "void main()                    \n"
        "{                              \n"
        "   color = vec4(MyColor,1.0f); \n"
        "}                              \n";

    GLuint program;
    GLuint vertex, fragment;

    vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &VERTEX_SHADER_SOURCE, NULL);
    glCompileShader(vertex);

    fragment = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment, 1, &FRAGMENT_SHADER_SOURCE, NULL);
    glCompileShader(fragment);

    program = glCreateProgram();
    glAttachShader(program, vertex);
    glAttachShader(program, fragment);
    glLinkProgram(program);

    glDeleteShader(vertex);
    glDeleteShader(fragment);

    GLfloat uniform = glGetUniformLocation(program, "movement");
    glUseProgram(program);



    //VAOs & VBOs
    GLfloat vertices[] =
//Uncomment one of the following set of vertices to see the program in action
//The last one produces the strange behaviour
    /*{
            //This set will show you a square occuping the full window
            -0.5f, -0.5f,  0.5f,        1.0f, 0.0f, 0.0f,
            -0.5f,  0.5f,  0.5f,        0.0f, 1.0f, 0.0f,
             0.5f, -0.5f,  0.5f,        0.0f, 0.0f, 1.0f,
             0.5f,  0.5f,  0.5f,        1.0f, 1.0f, 0.0f
    };/**/
    {
            //This set draw a square at the bottom
             0.25f, -0.25f,  1.0f,      1.0f, 0.0f, 0.0f,
            -0.25f, -0.25f,  1.0f,      0.0f, 1.0f, 0.0f,
             0.25f, -0.25f,  1.5f,      0.0f, 0.0f, 1.0f,
            -0.25f, -0.25f,  1.5f,      1.0f, 1.0f, 0.0f
    };/**/
    /*{
            //This set draw the square to the left (Z is negative therefore z/x is also negative and the x value is inversed)
            -0.5f, -0.5f, -0.5f,        1.0f, 0.0f, 0.0f,
            -0.5f,  0.5f, -0.5f,        0.0f, 1.0f, 0.0f,
            -0.5f, -0.5f, -1.0f,        0.0f, 0.0f, 1.0f,
            -0.5f,  0.5f, -1.0f,        1.0f, 1.0f, 0.0f
    };/**/
    /*{
            //This set should not draw anything because y = y/z -> y = -0.5/[-0.25,+0.25] -> y = (-inf,-4] U [4,inf)
            //[-0.25,+0.25] means any value between -0.25 and 0.25
            //(-inf,-4] U [4,inf) means any value that is not between -4 and 4
            //Whathever value 'y' gets is out of the range [-1,1] so it should not be visible, but instead a figure is drawn causing the strange behaviour
             0.5f, -0.5f, -0.25f,       1.0f, 0.0f, 0.0f,
            -0.5f, -0.5f, -0.25f,       0.0f, 1.0f, 0.0f,
             0.5f, -0.5f,  0.25f,       0.0f, 0.0f, 1.0f,
            -0.5f, -0.5f,  0.25f,       1.0f, 1.0f, 0.0f
    };/**/

    GLuint VAO, VBO;
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3*sizeof(GLfloat)));
    glEnableVertexAttribArray(1);



    //DRAW
    GLfloat movement = 0.0f;
    glfwSetTime(0.0);

    while (!glfwWindowShouldClose(window))
    {
        if(movement >= 2.5f)
            glfwSetTime(0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        movement = glfwGetTime()/4;
        glUniform1f(uniform, movement);
        glDrawArrays(GL_TRIANGLE_STRIP, 0,4);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }



    //END
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glfwTerminate();

    return 0;
}
added 4 characters in body
Source Link
Adrian
  • 677
  • 8
  • 18
Loading
Source Link
Adrian
  • 677
  • 8
  • 18
Loading