#include <glad/glad.h>

#include <GLFW/glfw3.h>

#include <glm/glm.hpp>

#include <glm/gtc/matrix_transform.hpp>

#include <glm/gtc/type_ptr.hpp>

#include <iostream>


void framebuffer_size_callback(GLFWwindow* window, int width, int height);

void processInput(GLFWwindow* window);


const char* vs_source[] =

{

"#version 410 core "

" "

"in vec4 position; "

" "

"out VS_OUT "

"{ "

" vec4 color; "

"} vs_out; "

" "

"uniform mat4 mv_matrix; "

"uniform mat4 proj_matrix; "

" "

"void main(void) "

"{ "

" gl_Position = proj_matrix * mv_matrix * position; "

" vs_out.color = position * 2.0 + vec4(0.5, 0.5, 0.5, 0.0); "

"} "

};


const char* fs_source[] =

{

"#version 410 core "

" "

"out vec4 color; "

" "

"in VS_OUT "

"{ "

" vec4 color; "

"} fs_in; "

" "

"void main(void) "

"{ "

" color = fs_in.color; "

"} "

};


const GLfloat vertex_positions[] =

{

-0.25f, 0.25f, -0.25f,

-0.25f, -0.25f, -0.25f,

0.25f, -0.25f, -0.25f,


0.25f, -0.25f, -0.25f,

0.25f, 0.25f, -0.25f,

-0.25f, 0.25f, -0.25f,


0.25f, -0.25f, -0.25f,

0.25f, -0.25f, 0.25f,

0.25f, 0.25f, -0.25f,


0.25f, -0.25f, 0.25f,

0.25f, 0.25f, 0.25f,

0.25f, 0.25f, -0.25f,


0.25f, -0.25f, 0.25f,

-0.25f, -0.25f, 0.25f,

0.25f, 0.25f, 0.25f,


-0.25f, -0.25f, 0.25f,

-0.25f, 0.25f, 0.25f,

0.25f, 0.25f, 0.25f,


-0.25f, -0.25f, 0.25f,

-0.25f, -0.25f, -0.25f,

-0.25f, 0.25f, 0.25f,


-0.25f, -0.25f, -0.25f,

-0.25f, 0.25f, -0.25f,

-0.25f, 0.25f, 0.25f,


-0.25f, -0.25f, 0.25f,

0.25f, -0.25f, 0.25f,

0.25f, -0.25f, -0.25f,


0.25f, -0.25f, -0.25f,

-0.25f, -0.25f, -0.25f,

-0.25f, -0.25f, 0.25f,


-0.25f, 0.25f, -0.25f,

0.25f, 0.25f, -0.25f,

0.25f, 0.25f, 0.25f,


0.25f, 0.25f, 0.25f,

-0.25f, 0.25f, 0.25f,

-0.25f, 0.25f, -0.25f

};


int main(void) {

GLuint program;

GLuint vao;

GLuint buffer;

GLint mv_location;

GLint proj_location;


float aspect;

glm::mat4 proj_matrix;


glfwInit();

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);

glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);


GLFWwindow* window = glfwCreateWindow(800, 600, "spinnycube", NULL, NULL);

if (window == NULL) {

std::cout << "Window Creation Failed" << std::endl;

return -1;

}

glfwMakeContextCurrent(window);

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);


// glad: load all OpenGL function pointers

// ---------------------------------------

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))

{

std::cout << "Failed to initialize GLAD" << std::endl;

return -1;

}


program = glCreateProgram();

GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(fs, 1, fs_source, NULL);

glCompileShader(fs);


GLuint vs = glCreateShader(GL_VERTEX_SHADER);

glShaderSource(vs, 1, vs_source, NULL);

glCompileShader(vs);


glAttachShader(program, vs);

glAttachShader(program, fs);


glLinkProgram(program);


mv_location = glGetUniformLocation(program, "mv_matrix");

proj_location = glGetUniformLocation(program, "proj_matrix");


glGenVertexArrays(1, &vao);

glBindVertexArray(vao);


glBindVertexArray(vao);


glGenBuffers(1, &buffer);

glBindBuffer(GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER,

sizeof(vertex_positions),

vertex_positions,

GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

glEnableVertexAttribArray(0);


glEnable(GL_CULL_FACE);

glFrontFace(GL_CW);


glEnable(GL_DEPTH_TEST);

glDepthFunc(GL_LEQUAL);


while (!glfwWindowShouldClose(window)) {

processInput(window);


static const GLfloat green[] = { 0.0f, 0.25f, 0.0f, 1.0f };

static const GLfloat one = 1.0f;


glClearBufferfv(GL_COLOR, 0, green);

glClearBufferfv(GL_DEPTH, 0, &one);


glUseProgram(program);


glUniformMatrix4fv(proj_location, 1, GL_FALSE, glm::value_ptr(proj_matrix));


float f = (float)glfwGetTime() * 0.3f;

glm::mat4 mv_matrix = glm::translate(proj_matrix, glm::vec3(0.0f, 0.0f, -4.0f)) *

glm::translate(proj_matrix, glm::vec3(sinf(2.1f * f) * 0.5f,

cosf(1.7f * f) * 0.5f,

sinf(1.3f * f) * cosf(1.5f * f) * 2.0f)) *

glm::rotate(proj_matrix, glm::radians((float)glfwGetTime() * 45.0f), glm::vec3(0.0f, 1.0f, 0.0f)) *

glm::rotate(proj_matrix, glm::radians((float)glfwGetTime() * 81.0f), glm::vec3(1.0f, 0.0f, 0.0f));

glUniformMatrix4fv(mv_location, 1, GL_FALSE, glm::value_ptr(mv_matrix));


glDrawArrays(GL_TRIANGLES, 0, 36);


glfwSwapBuffers(window);

glfwPollEvents();

}

}


// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly

// ---------------------------------------------------------------------------------------------------------

void processInput(GLFWwindow* window)

{

if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)

glfwSetWindowShouldClose(window, true);


}


// glfw: whenever the window size changed (by OS or user resize) this callback function executes

// ---------------------------------------------------------------------------------------------

void framebuffer_size_callback(GLFWwindow* window, int width, int height)

{

// make sure the viewport matches the new window dimensions; note that width and

// height will be significantly larger than specified on retina displays.

glViewport(0, 0, width, height);

}



큐브가 빙글빙글 돌아야 하는데 배경만 나오고 큐브는 아예 안그려지는데 원인이 뭘까여 ㅠ