Created
April 23, 2020 14:49
-
-
Save cacharle/cc22aee08e43ae425c4d3aef66bdbedf to your computer and use it in GitHub Desktop.
code from the OpenGL serie of the Cherno
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cassert> | |
#include <iostream> | |
#include <string> | |
#include <GL/glew.h> | |
#include <GLFW/glfw3.h> | |
static | |
unsigned int compileShader(unsigned int type, const std::string& source) | |
{ | |
unsigned int id = glCreateShader(type); | |
const char *s = source.c_str(); | |
glShaderSource(id, 1, &s, nullptr); | |
glCompileShader(id); | |
int result; | |
glGetShaderiv(id, GL_COMPILE_STATUS, &result); | |
if (result == GL_FALSE) | |
{ | |
int len; | |
glGetShaderiv(id, GL_INFO_LOG_LENGTH, &len); | |
char *msg = new char[len + 1]; | |
glGetShaderInfoLog(id, len, &len, msg); | |
std::cout << msg << std::endl; | |
delete msg; | |
glDeleteShader(id); | |
return 0; | |
} | |
return id; | |
} | |
static | |
unsigned int createShader(const std::string& vertexShader, const std::string& fragmentShader) | |
{ | |
unsigned int program = glCreateProgram(); | |
unsigned int vs = compileShader(GL_VERTEX_SHADER, vertexShader); | |
unsigned int fs = compileShader(GL_VERTEX_SHADER, fragmentShader); | |
assert(vs != 0); | |
assert(fs != 0); | |
glAttachShader(program, vs); | |
glAttachShader(program, fs); | |
glLinkProgram(program); | |
glValidateProgram(program); | |
glDeleteShader(vs); | |
glDeleteShader(fs); | |
return program; | |
} | |
int main(void) | |
{ | |
GLFWwindow* window; | |
if (!glfwInit()) | |
return 1; | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); | |
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | |
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); | |
if (!window) | |
{ | |
glfwTerminate(); | |
return 1; | |
} | |
glfwMakeContextCurrent(window); | |
if (glewInit() != GLEW_OK) | |
{ | |
std::cout << "Error" << std::endl; | |
return 1; | |
} | |
std::cout << glGetString(GL_VERSION) << std::endl; | |
float positions[6] = { | |
-0.5f, -0.5f, | |
0.0f, 0.5f, | |
0.5f, -0.5f, | |
}; | |
unsigned int buf; | |
unsigned int i; | |
glGenVertexArrays(1, &i); | |
glBindVertexArray(i); | |
glGenBuffers(1, &buf); | |
glBindBuffer(GL_ARRAY_BUFFER, buf); | |
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW); | |
glEnableVertexAttribArray(0); | |
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0); | |
std::string vertexShader = | |
"#version 330 core\n" | |
"layout(location = 0) in vec4 position;\n" | |
"void main()\n" | |
"{\n" | |
" gl_Position = position;\n" | |
"}\n"; | |
std::string fragmentShader = | |
"#version 330 core\n" | |
"layout(location = 0) out vec4 color;\n" | |
"void main()\n" | |
"{\n" | |
" color = vec4(1.0, 0.0, 0.0, 1.0);\n" | |
"}\n"; | |
unsigned int shader = createShader(vertexShader, fragmentShader); | |
glUseProgram(shader); | |
while (!glfwWindowShouldClose(window)) | |
{ | |
glClear(GL_COLOR_BUFFER_BIT); | |
glDrawArrays(GL_TRIANGLES, 0, 3); | |
// glDrawElements(GL_TRIANGLES, 3, 0 | |
glfwSwapBuffers(window); | |
glfwPollEvents(); | |
} | |
glDeleteProgram(shader); | |
glfwTerminate(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment