Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string>
- // include glfw
- // include glad
- static void glfwErrorCallback(int error, const char *description)
- {
- // printf("GLFW Error: [%d]: %s\n", error, description);
- fprintf(stdout, "GLFW Error: [%d]: %s\n", error, description);
- fprintf(stderr, "GLFW Error: [%d]: %s\n", error, description);
- exit(EXIT_FAILURE);
- }
- int main(int argc, char *argv[])
- {
- if (!glfwInit())
- {
- fprintf(stderr, "Failed to initialize GLFW\n");
- glfwTerminate();
- // return EXIT_FAILURE;
- exit(EXIT_FAILURE);
- }
- glfwSetErrorCallback(glfwErrorCallback);
- 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);
- glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
- GLFWwindow *window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL);
- glfwMakeContextCurrent(window);
- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
- {
- glfwTerminate();
- fprintf(stderr, "Failed to load OpenGL functions and extensions\n");
- // return EXIT_FAILURE;
- exit(EXIT_FAILURE);
- }
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLchar *vertexShaderSource =
- "#version 150\n"
- "in vec2 position;\n"
- "in vec2 tex_coord;\n"
- "out vec2 Tex_coord;\n"
- "void main() {\n"
- " gl_Position = vec4(position, 0.0, 1.0);\n"
- " Tex_coord = tex_coord;\n"
- "}\n";
- GLchar *fragmentShaderSource =
- "#version 150\n"
- "in vec2 Tex_coord;\n"
- "out vec4 outColor;\n"
- "uniform sampler2D tex;\n"
- "void main() {\n"
- " outColor = texture(tex, Tex_coord);\n"
- "}\n";
- GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
- GLuint frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
- GLint compile_status;
- glShaderSource(vertex_shader, 1, &vertexShaderSource, NULL);
- glCompileShader(vertex_shader);
- glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &compile_status);
- if (compile_status != GL_TRUE) {
- char buffer[512];
- glGetShaderInfoLog(vertex_shader, 512, NULL, buffer);
- throw std::runtime_error(buffer);
- }
- glShaderSource(frag_shader, 1, &fragmentShaderSource, NULL);
- glCompileShader(frag_shader);
- glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &compile_status);
- if (compile_status != GL_TRUE) {
- char buffer[512];
- glGetShaderInfoLog(frag_shader, 512, NULL, buffer);
- throw std::runtime_error(buffer);
- }
- GLuint shader_prog = glCreateProgram();
- glAttachShader(shader_prog, vertex_shader);
- glAttachShader(shader_prog, frag_shader);
- glBindFragDataLocation(shader_prog, 0, "outColor");
- glLinkProgram(shader_prog);
- glUseProgram(shader_prog);
- GLuint vao;
- glGenVertexArrays(1, &vao);
- glBindVertexArray(vao);
- const static GLfloat vertices[] = {
- // Position Tex-coords
- -1.0f, 1.0f, 0.0f, 0.0f, // Top-left
- 1.0f, 1.0f, 1.0f, 0.0f, // Top-right
- 1.0f, -1.0f, 1.0f, 1.0f, // Bottom-right
- -1.0f, -1.0f, 0.0f, 1.0f // Bottom-left
- };
- GLuint vbo;
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STREAM_DRAW);
- const static GLuint elements[] = {
- 0, 1, 2,
- 2, 3, 0
- };
- GLuint ebo;
- glGenBuffers(1, &ebo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STREAM_DRAW);
- GLint pos_attrib = glGetAttribLocation(shader_prog, "position");
- glVertexAttribPointer(pos_attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), 0);
- glEnableVertexAttribArray(pos_attrib);
- GLint tex_coord_attrib = glGetAttribLocation(shader_prog, "tex_coord");
- glEnableVertexAttribArray(tex_coord_attrib);
- glVertexAttribPointer(tex_coord_attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
- const GLsizei textureWidth = 2, textureHeight = 2;
- GLfloat pixels[textureWidth * textureHeight * 3] = {
- 1.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 1.0f,
- 1.0f, 1.0f, 0.0f,
- };
- GLuint texture;
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureWidth, textureHeight, 0, GL_RGB, GL_FLOAT, pixels);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, texture);
- glUniform1i(glGetUniformLocation(shader_prog, "tex"), 0);
- while (!glfwWindowShouldClose(window))
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
- GLenum err = glGetError();
- if (err)
- printf("Error: %d\n", err);
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
- glfwDestroyWindow(window);
- glfwTerminate();
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement