From 9fd302c683885fd8bdfeea83f46ab1e1367d3fe9 Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 10 Jan 2019 23:02:46 +0000 Subject: [PATCH] GL basics --- OpenGL/cube/cube.a | Bin 17944 -> 79064 bytes OpenGL/cube/shaders/simple.frag | 7 ++ OpenGL/cube/shaders/simple.vert | 8 +++ OpenGL/cube/src/main.cpp | 116 +++++++++++++++++++++++++++++++- 4 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 OpenGL/cube/shaders/simple.frag create mode 100644 OpenGL/cube/shaders/simple.vert diff --git a/OpenGL/cube/cube.a b/OpenGL/cube/cube.a index 45a39f4a1fb0bb4f1641461989d50fd14ee0db2c..7fabf8993d850989bd952480228f12f8a82e1be6 100755 GIT binary patch literal 79064 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 xoHDpuHJI!W#O>$#hwcw #include #include +#include +#include +#include +#include class Game { public: @@ -9,6 +13,76 @@ public: bool isWindowClosed = true; }; +std::map VertexShaders; +std::map FragmentShaders; +std::map ShaderPrograms; + +std::string readShader(std::string source) { + std::ifstream t(source); + std::string shaderCode((std::istreambuf_iterator(t)), + std::istreambuf_iterator()); + return shaderCode; +} + +bool loadShader(std::string shaderSource, GLenum type, std::string shader) { + const char* source = shader.c_str(); + + if (type == GL_VERTEX_SHADER) { + GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &source, NULL); + glCompileShader(vertexShader); + + GLint status; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); + if (status == GL_TRUE) { + char buf[512]; + glGetShaderInfoLog(vertexShader, 512, NULL, buf); + std::cerr << buf << std::endl; + return false; + } + + VertexShaders[shader] = vertexShader; + } else if (type == GL_FRAGMENT_SHADER) { + GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &source, NULL); + glCompileShader(fragmentShader); + + GLint status; + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status); + if (status == GL_TRUE) { + char buf[512]; + glGetShaderInfoLog(fragmentShader, 512, NULL, buf); + std::cerr << buf << std::endl; + return false; + } + + FragmentShaders[shader] = fragmentShader; + } + return true; +} + +void makeShaderProgram(std::string vert, std::string frag, std::string program) { + GLuint shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, VertexShaders[vert]); + glAttachShader(shaderProgram, FragmentShaders[frag]); + ShaderPrograms[program] = shaderProgram; +} + +void applySimpleShaders(std::string program) { + glBindFragDataLocation(ShaderPrograms[program], 0, "outColour"); + GLint posAttrib = glGetAttribLocation(ShaderPrograms[program], "position"); + glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(posAttrib); +} + +void linkShader(std::string shader) { + glLinkProgram(ShaderPrograms[shader]); +} + +void applyShader(std::string shader) { + glUseProgram(ShaderPrograms[shader]); +} + int main(int argc, char** argv) { Game* game = new Game(); SDL_Init(SDL_INIT_EVERYTHING); @@ -31,23 +105,59 @@ int main(int argc, char** argv) { GLenum GLEWStatus = glewInit(); if (GLEWStatus != GLEW_OK) { std::cerr << "FAILED TO INITALIZE GLEW" << std::endl; + return 0; } // SDL_WarpMouseInWindow(m_window, width / 2, height / 2); // SDL_SetRelativeMouseMode(SDL_TRUE); + game->isWindowClosed = false; glClearColor(0.1f, 0.45f, 0.9f, 1.0f); + // GL Screen coordinates of a 2D triangle + float verticies[] = { + 0.0f, 0.5f, // Vertex 1 (X, Y) + 0.5f, -0.5f, // Vertex 2 (X, Y) + -0.5f, -0.5f // Vertex 3 (X, Y) + }; + + // Generate a vertex array object + GLuint vao; + glGenVertexArrays(1, &vao); + // Bind array to GPU + glBindVertexArray(vao); + + // Generate a vertex buffer object + GLuint vbo; + glGenBuffers(1, &vbo); + // Binding buffer to GPU + glBindBuffer(GL_ARRAY_BUFFER, vbo); + // Copy vertex data to the vertex buffer already on the GPU + glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW); + + // Load, compile, apply and link shader programs + if (!loadShader(readShader("shaders/simple.frag"), GL_FRAGMENT_SHADER, "simpleFrag") || + !loadShader(readShader("shaders/simple.vert"), GL_VERTEX_SHADER , "simpleVert")) { + return 0; + } + makeShaderProgram("simpleVert", "simpleFrag", "simpleProc"); + applySimpleShaders("simpleProc"); + linkShader("simpleProc"); + SDL_Event event; while (!game->isWindowClosed) { - glClear(GL_COLOR_BUFFER_BIT); - + // Input handling while (SDL_PollEvent(&event) != 0) if (event.key.keysym.sym == SDLK_ESCAPE) game->isWindowClosed = true; + // Render + glClear(GL_COLOR_BUFFER_BIT); + applyShader("simpleProc"); + glDrawArrays(GL_TRIANGLES, 0, 3); + // Swap buffers SDL_GL_SwapWindow(game->window); } @@ -55,4 +165,6 @@ int main(int argc, char** argv) { SDL_GL_DeleteContext(game->glContext); SDL_DestroyWindow(game->window); SDL_Quit(); + + return 0; }