#include <GL/glew.h>
#include <glfw3.h>
#include <stdio.h>
#include <string.h>
const GLint WIDTH = 800, HEIGHT = 600;
GLuint VAO, VBO, shader;
static const char* vertexShader =
"#version 460\n"
"layout(location = 0) in vec3 pos;"
"void main()"
"{"
"gl_Position = vec4(pos.x, pos.y, pos.z, 1.0);"
"}";
static const char* fragmentShader =
"#version 460\n"
"out vec4 FragmentColor;"
"void main()"
"{"
" FragmentColor = vec4(0.0, 1.0, 0.0, 1.0);"
"}";
void CreateTriangle() {
GLfloat vertices[] = {
0.0f, 0.5, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, -0.5f, 0.0f
};
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
}
void AddShader(GLuint program, const char* shaderCode, GLenum shaderType) {
unsigned int ShaderID = glCreateShader(shaderType);
const char* theCode = shaderCode;
const int codeLength = (int)strlen(shaderCode);
glShaderSource(ShaderID, 1, &theCode, &codeLength);
glCompileShader(ShaderID);
int result = 0;
char error[1024] = { 0 };
glGetShaderiv(ShaderID, GL_COMPILE_STATUS, &result);
if (!result) {
glGetShaderInfoLog(ShaderID, sizeof(error), NULL, error);
printf("Error compiling the %d shader: %s", shaderType, error);
return;
}
glAttachShader(program, ShaderID);
}
void CompileShaders() {
shader = glCreateProgram();
if (!shader) {
printf("glCreateProgram() Error");
return;
}
AddShader(shader, vertexShader, GL_VERTEX_SHADER);
AddShader(shader, fragmentShader, GL_FRAGMENT_SHADER);
GLint result = 0;
GLchar error[1024] = { 0 };
glLinkProgram(shader);
glGetProgramiv(shader, GL_LINK_STATUS, &result);
if (!result) {
glGetProgramInfoLog(shader, sizeof(error), NULL, error);
printf("glLinkProgram() Error: %s", error);
return;
}
}
int main(void)
{
if (!glfwInit()) {
printf("glfwInit() Error");
return 1;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "window title", NULL, NULL);
if (!window) {
printf("glfwCreateWindow() Error");
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) {
printf("glewInit() Error");
glfwDestroyWindow(window);
glfwTerminate();
}
CreateTriangle();
CompileShaders();
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
glClearColor(1.0f, 0.5f, 0.25f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
/*
run:
*/