diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/opengl/renderer.cpp | 41 | ||||
| -rw-r--r-- | src/opengl/renderer.hpp | 28 | ||||
| -rw-r--r-- | src/opengl/shaders.hpp | 1 | ||||
| -rw-r--r-- | src/rms.cpp | 7 |
4 files changed, 54 insertions, 23 deletions
diff --git a/src/opengl/renderer.cpp b/src/opengl/renderer.cpp index 1898753..1a7166d 100644 --- a/src/opengl/renderer.cpp +++ b/src/opengl/renderer.cpp @@ -18,7 +18,9 @@ void GLAPIENTRY MessageCallback( GLenum source, } -Renderer::Renderer(short width,short height): Width(width),Height(height), ClockStart(steady_clock::now()){ +Renderer::Renderer(short width,short height, std::string shader_name): + Width(width),Height(height), ClockStart(steady_clock::now()), + CurrentShader(shader_name){ // Init OpenGl glewInit(); glEnable(GL_DEPTH_TEST); @@ -33,24 +35,25 @@ Renderer::Renderer(short width,short height): Width(width),Height(height), Clock glGenBuffers(1, &vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); float square[]{ - -1,1,0, - 1,1,0, - -1,-1,0, - - -1,-1,0, - 1,1,0, - 1,-1,0 - + -1,1,0,1,1,0,-1,-1,0, + -1,-1,0,1,1,0,1,-1,0 }; glBufferData(GL_ARRAY_BUFFER, 6*3*sizeof(float), square, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)0); glBindVertexArray(0); - LoadShader("square.glsl"); + LoadShader(); +} + +Renderer::~Renderer(){ + glDeleteProgram(RayMarchingShader); + glDeleteVertexArrays(1,&VAO); } void Renderer::Render(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Setup shader glUseProgram(RayMarchingShader); MProjection=glm::ortho(-10.0f,10.0f,-10.0f,10.0f,0.f,100.0f); MModel=glm::scale(glm::mat4(1.0f),glm::vec3(10,10,1)); @@ -59,22 +62,28 @@ void Renderer::Render(){ ClockCurrent = std::chrono::steady_clock::now(); duration<double> time_span = duration_cast<duration<double>>(ClockCurrent - ClockStart); glUniform1f(UTime, time_span.count()); - glUniform2f(UResolution,Width,Height); + + // Draw the actual shader onto the quad glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES,0,6); glBindVertexArray(0); glUseProgram(0); } -void Renderer::UpdateShader(std::string name){ +void Renderer::ChangeShader(std::string name){ + this->CurrentShader=name; + glDeleteProgram(RayMarchingShader); + LoadShader(); +} + +void Renderer::RefreshShader(){ glDeleteProgram(RayMarchingShader); - LoadShader(name); + LoadShader(); } -void Renderer::LoadShader(std::string name){ - RayMarchingShader = CompileShader("square.glsl"); - RayMarchingShader = CompileShader("square.glsl"); +void Renderer::LoadShader(){ + RayMarchingShader = CompileShader(CurrentShader); UProjection = glGetUniformLocation(RayMarchingShader, "projection"); UModel = glGetUniformLocation(RayMarchingShader, "model"); UResolution = glGetUniformLocation(RayMarchingShader, "resolution"); diff --git a/src/opengl/renderer.hpp b/src/opengl/renderer.hpp index 157ceb3..5cb7b3d 100644 --- a/src/opengl/renderer.hpp +++ b/src/opengl/renderer.hpp @@ -43,12 +43,34 @@ private: short Width,Height; steady_clock::time_point ClockStart; steady_clock::time_point ClockCurrent; + /// @brief Current loaded shader name + std::string CurrentShader; - void LoadShader(std::string name); + /** + * Compile send CurrentShader to the graphics card + */ + void LoadShader(); public: - Renderer(short width,short height); + Renderer(short width,short height,std::string shader_name); + ~Renderer(); + /** + * Draw current shader into the screen + */ void Render(); + /** + * Change current OpenGL viewport. + * @param with + * @param height + */ void AjustViewport(short with,short height); - void UpdateShader(std::string name); + /** + * Compile and load another shader + * @param name The name of the new shader + */ + void ChangeShader(std::string name); + /** + * Refresh CurrentShader code (recompile it etc..) + */ + void RefreshShader(); }; diff --git a/src/opengl/shaders.hpp b/src/opengl/shaders.hpp index ba7da09..9017222 100644 --- a/src/opengl/shaders.hpp +++ b/src/opengl/shaders.hpp @@ -10,6 +10,7 @@ #else #define SHADERS_RESOURCES "resources/shaders/" #endif + /** * Compile a shader: * - Shader should contains both vertex and fragment code diff --git a/src/rms.cpp b/src/rms.cpp index d2c6136..7238920 100644 --- a/src/rms.cpp +++ b/src/rms.cpp @@ -11,12 +11,12 @@ int main(int argc, char *argv[]) settings.depthBits = 24; settings.stencilBits = 8; settings.antialiasingLevel = 3; - settings.attributeFlags=sf::ContextSettings::Core; + settings.attributeFlags=sf::ContextSettings::Default; sf::Window window(sf::VideoMode(WIDTH, HEIGHT,32), "SFML/OpenGL Ray Marching", sf::Style::Close, settings); window.setFramerateLimit(60); // Limit to 60 frames per second // Init Renderer/OpenGL - Renderer renderer(WIDTH,HEIGHT); + Renderer renderer(WIDTH,HEIGHT,"main.glsl"); // Main loop bool running=true; @@ -31,9 +31,8 @@ int main(int argc, char *argv[]) else if (event.type == sf::Event::Resized) renderer.AjustViewport(event.size.width,event.size.height); else if (event.key.code == sf::Keyboard::R) - renderer.UpdateShader("square.glsl"); + renderer.RefreshShader(); } - renderer.Render(); window.display(); // Refresh screen } |
