hello triangle
This commit is contained in:
@@ -32,11 +32,17 @@ App::App():
|
|||||||
glfwSetErrorCallback(error_callback_s);
|
glfwSetErrorCallback(error_callback_s);
|
||||||
glfwInit();
|
glfwInit();
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||||
|
|
||||||
mpWindow = glfwCreateWindow(640, 480, "uGLy", NULL, NULL);
|
mpWindow = glfwCreateWindow(640, 480, "uGLy", NULL, NULL);
|
||||||
glfwSetWindowUserPointer(mpWindow, this);
|
glfwSetWindowUserPointer(mpWindow, this);
|
||||||
glfwSetKeyCallback(mpWindow, key_callback_s);
|
glfwSetKeyCallback(mpWindow, key_callback_s);
|
||||||
|
|
||||||
glfwMakeContextCurrent(mpWindow);
|
glfwMakeContextCurrent(mpWindow);
|
||||||
|
glewExperimental = GL_TRUE;
|
||||||
if(glewInit() != GLEW_OK) {
|
if(glewInit() != GLEW_OK) {
|
||||||
error_callback_s(GLFW_NO_ERROR, "glewInit() failed");
|
error_callback_s(GLFW_NO_ERROR, "glewInit() failed");
|
||||||
}
|
}
|
||||||
@@ -50,8 +56,71 @@ App::~App() {
|
|||||||
|
|
||||||
|
|
||||||
void App::game_loop() {
|
void App::game_loop() {
|
||||||
|
float vertices[] = {
|
||||||
|
.0f, .5f,
|
||||||
|
.5f, -.5f,
|
||||||
|
-.5f, -.5f
|
||||||
|
};
|
||||||
|
|
||||||
|
GLuint vbo;
|
||||||
|
glGenBuffers(1, &vbo);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
auto vertexSource = R"glsl(
|
||||||
|
#version 150 core
|
||||||
|
in vec2 position;
|
||||||
|
void main() { gl_Position = vec4(position, 0.0, 1.0); }
|
||||||
|
)glsl";
|
||||||
|
|
||||||
|
GLint status;
|
||||||
|
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
glShaderSource(vertexShader, 1, &vertexSource, NULL);
|
||||||
|
glCompileShader(vertexShader);
|
||||||
|
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status);
|
||||||
|
if(!status) {
|
||||||
|
error_callback_s(GLFW_NO_ERROR, "glShaderSource() failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto fragmentSource = R"glsl(
|
||||||
|
#version 150 core
|
||||||
|
uniform vec3 triangleColor;
|
||||||
|
out vec4 color;
|
||||||
|
void main() { color = vec4(triangleColor, 1.0); }
|
||||||
|
)glsl";
|
||||||
|
|
||||||
|
|
||||||
|
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
|
||||||
|
glCompileShader(fragmentShader);
|
||||||
|
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status);
|
||||||
|
if(!status) {
|
||||||
|
error_callback_s(GLFW_NO_ERROR, "glShaderSource() failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint shaderProgram = glCreateProgram();
|
||||||
|
glAttachShader(shaderProgram, vertexShader);
|
||||||
|
glAttachShader(shaderProgram, fragmentShader);
|
||||||
|
glLinkProgram(shaderProgram);
|
||||||
|
glUseProgram(shaderProgram);
|
||||||
|
|
||||||
|
GLuint vao;
|
||||||
|
glGenVertexArrays(1, &vao);
|
||||||
|
glBindVertexArray(vao);
|
||||||
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
|
||||||
|
auto start = glfwGetTime();
|
||||||
|
|
||||||
while(!glfwWindowShouldClose(mpWindow)) {
|
while(!glfwWindowShouldClose(mpWindow)) {
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
|
auto now = glfwGetTime();
|
||||||
|
glUniform3f(glGetUniformLocation(shaderProgram, "triangleColor"), (sin(now-start) + 1.0f) / 2.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
glfwSwapBuffers(mpWindow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user