From 61d34d7aac15d0bcc3dd464b0782ba8b25235331 Mon Sep 17 00:00:00 2001 From: plane000 Date: Mon, 17 Sep 2018 20:19:59 +0100 Subject: [PATCH] On the fly shader switching --- OpenGL/OpenGL.vcxproj | 2 +- OpenGL/display.cpp | 13 +++---- OpenGL/main.cpp | 38 ++++++++++++++----- resources/shaders/col_fragment.glsl | 11 ++++++ .../{simple2d_vertex.glsl => col_vertex.glsl} | 0 resources/shaders/gradient_fragment.glsl | 11 ++++++ resources/shaders/gradient_vertex.glsl | 13 +++++++ ...2d_fragment.glsl => texGrad_fragment.glsl} | 0 resources/shaders/texGrad_vertex.glsl | 13 +++++++ resources/shaders/tex_fragment.glsl | 11 ++++++ resources/shaders/tex_vertex.glsl | 13 +++++++ 11 files changed, 106 insertions(+), 19 deletions(-) create mode 100644 resources/shaders/col_fragment.glsl rename resources/shaders/{simple2d_vertex.glsl => col_vertex.glsl} (100%) create mode 100644 resources/shaders/gradient_fragment.glsl create mode 100644 resources/shaders/gradient_vertex.glsl rename resources/shaders/{simple2d_fragment.glsl => texGrad_fragment.glsl} (100%) create mode 100644 resources/shaders/texGrad_vertex.glsl create mode 100644 resources/shaders/tex_fragment.glsl create mode 100644 resources/shaders/tex_vertex.glsl diff --git a/OpenGL/OpenGL.vcxproj b/OpenGL/OpenGL.vcxproj index 1a15d8b..0226185 100644 --- a/OpenGL/OpenGL.vcxproj +++ b/OpenGL/OpenGL.vcxproj @@ -22,7 +22,7 @@ 15.0 {BE30292B-9C31-474C-AC8C-E1BFA61BD1A1} OpenGL - 10.0.17134.0 + 10.0.16299.0 diff --git a/OpenGL/display.cpp b/OpenGL/display.cpp index 61ba2a8..4ee6604 100644 --- a/OpenGL/display.cpp +++ b/OpenGL/display.cpp @@ -6,6 +6,7 @@ Display::Display(int width, int height, const std::string& title) { SDL_Init(SDL_INIT_VIDEO); + SDL_GL_SetSwapInterval(0); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); @@ -21,20 +22,15 @@ Display::Display(int width, int height, const std::string& title) { std::cerr << "GLEW Failed to initialize" << std::endl; } + SDL_WarpMouseInWindow(m_window, width / 2, height / 2); + SDL_SetRelativeMouseMode(SDL_TRUE); + m_isClosed = false; std::cout << "Display initialized and gl context successfuly created" << std::endl; } void Display::Update() { SDL_GL_SwapWindow(m_window); - - SDL_Event e; - - while (SDL_PollEvent(&e)) { - if (e.type == SDL_QUIT) { - m_isClosed = true; - } - } } bool Display::isClosed() { @@ -45,4 +41,5 @@ Display::~Display() { SDL_GL_DeleteContext(m_glContext); SDL_DestroyWindow(m_window); SDL_Quit(); + m_isClosed = true; } diff --git a/OpenGL/main.cpp b/OpenGL/main.cpp index 58973e6..05fa43d 100644 --- a/OpenGL/main.cpp +++ b/OpenGL/main.cpp @@ -42,37 +42,55 @@ int main(int argc, char** argv) { ShaderMode mode = ShaderMode::SHADER_COLOUR; Mesh mesh(vertices, indices, sizeof(vertices) / sizeof(vertices[0])); - Texture chanceCube("C:/Users/Ben/Desktop/crumpet-engine/resources/textures/chance-cube.jpg"); - Shader shader("C:/Users/Ben/Desktop/crumpet-engine/resources/shaders/simple2d"); + // std::string resourceFolder = "C:/Users/Ben/Desktop/crumpet-engine/"; // Laptop + std::string resourceFolder = "E:/Games/Practicing/OpenGL/"; // PC + + Shader texShader(resourceFolder + "resources/shaders/tex"); + Shader colourShader(resourceFolder + "resources/shaders/col"); + Shader gradientShader(resourceFolder + "resources/shaders/gradient"); + Shader texGradientShader(resourceFolder + "resources/shaders/texGrad"); + + Texture chanceCube(resourceFolder + "resources/textures/chance-cube.jpg"); - unsigned int ticks = SDL_GetTicks(); - unsigned int frames = 0; + SDL_Event event; while(!display.isClosed()) { glClear(GL_COLOR_BUFFER_BIT); switch(mode) { case ShaderMode::SHADER_TEXURE: + chanceCube.Bind(0); + texShader.Bind(); break; case ShaderMode::SHADER_COLOUR: + colourShader.Bind(); break; case ShaderMode::SHADER_GRADIENT: + gradientShader.Bind(); break; case ShaderMode::SHADER_TEXGRADIENT: - break; - default: + chanceCube.Bind(0); + texGradientShader.Bind(); break; } - shader.Bind(); - - chanceCube.Bind(0); mesh.Draw(); + while (SDL_PollEvent(&event) != 0) { + if (event.type == SDL_KEYDOWN) { + if (mode == ShaderMode::SHADER_TEXURE) mode = ShaderMode::SHADER_COLOUR; + else if (mode == ShaderMode::SHADER_COLOUR) mode = ShaderMode::SHADER_GRADIENT; + else if (mode == ShaderMode::SHADER_GRADIENT) mode = ShaderMode::SHADER_TEXGRADIENT; + else if (mode == ShaderMode::SHADER_TEXGRADIENT) mode = ShaderMode::SHADER_TEXURE; + if (event.key.keysym.sym == SDLK_ESCAPE) { + display.~Display(); + } + } + } + display.Update(); - frames++; } display.~Display(); diff --git a/resources/shaders/col_fragment.glsl b/resources/shaders/col_fragment.glsl new file mode 100644 index 0000000..21d6b09 --- /dev/null +++ b/resources/shaders/col_fragment.glsl @@ -0,0 +1,11 @@ +#version 330 core +out vec4 FragColor; + +in vec3 ourColor; +in vec2 TexCoord; + +uniform sampler2D ourTexture; + +void main() { + FragColor = vec4(0.25, 0.9, 1.0, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/simple2d_vertex.glsl b/resources/shaders/col_vertex.glsl similarity index 100% rename from resources/shaders/simple2d_vertex.glsl rename to resources/shaders/col_vertex.glsl diff --git a/resources/shaders/gradient_fragment.glsl b/resources/shaders/gradient_fragment.glsl new file mode 100644 index 0000000..f741038 --- /dev/null +++ b/resources/shaders/gradient_fragment.glsl @@ -0,0 +1,11 @@ +#version 330 core +out vec4 FragColor; + +in vec3 ourColor; +in vec2 TexCoord; + +uniform sampler2D ourTexture; + +void main() { + FragColor = vec4(ourColor, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/gradient_vertex.glsl b/resources/shaders/gradient_vertex.glsl new file mode 100644 index 0000000..7de44d9 --- /dev/null +++ b/resources/shaders/gradient_vertex.glsl @@ -0,0 +1,13 @@ +#version 330 core +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aColor; +layout (location = 2) in vec2 aTexCoord; + +out vec3 ourColor; +out vec2 TexCoord; + +void main() { + gl_Position = vec4(aPos, 1.0); + ourColor = aColor; + TexCoord = aTexCoord; +} \ No newline at end of file diff --git a/resources/shaders/simple2d_fragment.glsl b/resources/shaders/texGrad_fragment.glsl similarity index 100% rename from resources/shaders/simple2d_fragment.glsl rename to resources/shaders/texGrad_fragment.glsl diff --git a/resources/shaders/texGrad_vertex.glsl b/resources/shaders/texGrad_vertex.glsl new file mode 100644 index 0000000..7de44d9 --- /dev/null +++ b/resources/shaders/texGrad_vertex.glsl @@ -0,0 +1,13 @@ +#version 330 core +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aColor; +layout (location = 2) in vec2 aTexCoord; + +out vec3 ourColor; +out vec2 TexCoord; + +void main() { + gl_Position = vec4(aPos, 1.0); + ourColor = aColor; + TexCoord = aTexCoord; +} \ No newline at end of file diff --git a/resources/shaders/tex_fragment.glsl b/resources/shaders/tex_fragment.glsl new file mode 100644 index 0000000..1b8c9b0 --- /dev/null +++ b/resources/shaders/tex_fragment.glsl @@ -0,0 +1,11 @@ +#version 330 core +out vec4 FragColor; + +in vec3 ourColor; +in vec2 TexCoord; + +uniform sampler2D ourTexture; + +void main() { + FragColor = texture(ourTexture, TexCoord); +} \ No newline at end of file diff --git a/resources/shaders/tex_vertex.glsl b/resources/shaders/tex_vertex.glsl new file mode 100644 index 0000000..7de44d9 --- /dev/null +++ b/resources/shaders/tex_vertex.glsl @@ -0,0 +1,13 @@ +#version 330 core +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aColor; +layout (location = 2) in vec2 aTexCoord; + +out vec3 ourColor; +out vec2 TexCoord; + +void main() { + gl_Position = vec4(aPos, 1.0); + ourColor = aColor; + TexCoord = aTexCoord; +} \ No newline at end of file