Skip to content

Instantly share code, notes, and snippets.

@josmithua
Last active August 29, 2015 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save josmithua/1fb4571aed04414d0102 to your computer and use it in GitHub Desktop.
Save josmithua/1fb4571aed04414d0102 to your computer and use it in GitHub Desktop.
Basic Procedure of Drawing Something in OpenGL 3.3
#include <gl/glew.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
GLuint vao;
GLuint vbo;
GLuint shader_program;
GLint uniform_color;
GLint uniform_MVP;
struct point {
GLdouble x;
GLdouble y;
};
void main() {
//////////////// Create buffer objects ////////////////////
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
/////////////// Create shader program //////////////////////
static const GLchar * vertex_shader_source[] =
{
"#version 330 core \n"
" \n"
"layout(location = 0) in vec2 position; \n"
" \n"
"uniform mat4 MVP; \n"
" \n"
"void main(){ \n"
" gl_Position = MVP * vec4(position.xy, 0, 1); \n"
"} \n"
}
static const GLchar * fragment_shader_source[] =
{
"#version 330 core \n"
" \n"
"uniform vec4 vertexColor; \n"
" \n"
"out vec4 color; \n"
" \n"
"void main(){ \n"
" color = vertexColor; \n"
"} \n"
}
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
glCompileShader(vertex_shader);
GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER;
glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
glCompileShader(fragment_shader);
shader_program = glCreateProgram();
glAttachShader(shader_program, vertex_shader);
glAttachShader(shader_program, fragment_shader);
glLinkProgram(shader_program);
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
glUseProgram(shader_program);
uniform_MVP = glGetUniformLocation(shader_program, "MVP");
uniform_color = glGetUniformLocation(shader_program, "vertexColor");
/////////////// Set up data and automatic vertex attribute filling ////////////////////
static const point border[4] = {{-1.0f, -1.0f}, {1.0f, -1.0f}, {1.0f, 1.0f}, {-1.0f, 1.0f}};
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(border), border, GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_DOUBLE, GL_FALSE, 0, (void*)0);
/////////////// Send data to uniforms ///////////////////////////
glm::mat4 MVP = glm::mat4(1.0f);
MVP = glm::scale(MVP, glm::vec3(0.9f, 0.9f, 1.0f));
glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, &MVP[0][0]);
GLfloat color[4] = {1.0f, 0.0f, 0.0f, 1.0f}; // Red
glUniform4fv(uniform_color, 1, color);
/////////////// Finally draw! ///////////////////
glDrawArrays(GL_LINE_LOOP, 0, 4);
////////////// Delete stuff after you're done ///////////////
glDeleteBuffers(1, &vbo);
glDeleteVertexArrays(1, &vao);
glDeleteProgram(shader_program);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment