int App::start(const std::vector<CL_String> &args) { CL_OpenGLWindowDescription description; description.set_title("Guassian Blur Shader"); description.set_size(CL_Size(1024, 768), true); CL_DisplayWindow window(description); CL_InputDevice keyboard = window.get_ic().get_keyboard(); CL_GraphicContext gc = window.get_gc(); CL_Slot slot_input_up = (window.get_ic().get_keyboard()).sig_key_up().connect(this, &App::on_input_up); CL_Slot slot_window_close = window.sig_window_close().connect(this, &App::window_close); // Create offscreen texture CL_Texture texture_offscreen(gc, gc.get_width(), gc.get_height()); texture_offscreen.set_min_filter(cl_filter_nearest); texture_offscreen.set_mag_filter(cl_filter_nearest); CL_Texture texture_offscreen2(gc, gc.get_width(), gc.get_height()); texture_offscreen2.set_min_filter(cl_filter_nearest); texture_offscreen2.set_mag_filter(cl_filter_nearest); // Create offscreen framebuffer CL_FrameBuffer framebuffer_offscreen(gc); framebuffer_offscreen.attach_color_buffer(0, texture_offscreen); CL_FrameBuffer framebuffer_offscreen2(gc); framebuffer_offscreen2.attach_color_buffer(0, texture_offscreen2); CL_Image background(gc, "../PostProcessing/Resources/background.png"); CL_Image ball(gc, "../PostProcessing/Resources/ball.png"); ball.set_alignment(origin_center); // Load and link shaders CL_ProgramObject shader = CL_ProgramObject::load(gc, "Resources/vertex_shader.glsl", "Resources/fragment_shader.glsl"); shader.bind_attribute_location(0, "Position"); shader.bind_attribute_location(2, "TexCoord0"); if (!shader.link()) throw CL_Exception("Unable to link shader program: Error:" + shader.get_info_log()); quit = false; float amount = 0.0f; float timer = 0.0f; float scale = 1.0f; CL_Font font(gc, "tahoma", 32); blur = 1.0f; unsigned int startTime = CL_System::get_time(); while (!quit) { timer = (CL_System::get_time() - startTime) / 1000.0f; // Render standard image to offscreen buffer gc.set_frame_buffer(framebuffer_offscreen); background.draw(gc, 0, 0); ball.draw(gc, gc.get_width() / 2 + 200 * sinf(timer / 2.0f), gc.get_height() / 2 + 200 * cosf(timer / 2.0f)); gc.reset_frame_buffer(); gc.set_frame_buffer(framebuffer_offscreen2); render_gaussian_blur(gc, blur, texture_offscreen, shader, 1.0f / texture_offscreen2.get_width(), 0.0f); gc.reset_frame_buffer(); render_gaussian_blur(gc, blur, texture_offscreen2, shader, 0.0f, 1.0f / texture_offscreen2.get_height()); CL_String text( "Press 1 to 9 to control blur amount. Currently it is :" + CL_StringHelp::float_to_text(blur) ); font.draw_text(gc, 10, 64, text); window.flip(); CL_System::sleep(10); CL_KeepAlive::process(); } return 0; }
int App::start(const std::vector<std::string> &args) { clan::DisplayWindowDescription description; description.set_title("Guassian Blur Shader"); description.set_size(clan::Size(1024, 768), true); clan::DisplayWindow window(description); clan::InputDevice keyboard = window.get_ic().get_keyboard(); clan::Canvas canvas(window); clan::SlotContainer cc; cc.connect(window.get_ic().get_keyboard().sig_key_up(), clan::bind_member(this, &App::on_input_up)); cc.connect(window.sig_window_close(), clan::bind_member(this, &App::window_close)); // Create offscreen texture clan::Texture2D texture_offscreen(canvas, canvas.get_width(), canvas.get_height()); texture_offscreen.set_min_filter(clan::filter_nearest); texture_offscreen.set_mag_filter(clan::filter_nearest); clan::Texture2D texture_offscreen2(canvas, canvas.get_width(), canvas.get_height()); texture_offscreen2.set_min_filter(clan::filter_nearest); texture_offscreen2.set_mag_filter(clan::filter_nearest); // Create offscreen framebuffer clan::FrameBuffer framebuffer_offscreen(canvas); framebuffer_offscreen.attach_color(0, texture_offscreen); clan::Canvas canvas_offscreen(canvas, framebuffer_offscreen); clan::FrameBuffer framebuffer_offscreen2(canvas); framebuffer_offscreen2.attach_color(0, texture_offscreen2); clan::Canvas canvas_offscreen2(canvas, framebuffer_offscreen2); clan::Image background(canvas, "../PostProcessing/Resources/background.png"); clan::Image ball(canvas, "../PostProcessing/Resources/ball.png"); ball.set_alignment(clan::origin_center); // Load and link shaders clan::ProgramObject shader = clan::ProgramObject::load(canvas, "Resources/vertex_shader.glsl", "Resources/fragment_shader.glsl"); shader.bind_attribute_location(0, "Position"); shader.bind_attribute_location(1, "TexCoord0"); shader.bind_frag_data_location(0, "cl_FragColor"); if (!shader.link()) throw clan::Exception("Unable to link shader program: Error:" + shader.get_info_log()); shader.set_uniform1i("SourceTexture", 0); gpu_positions = clan::VertexArrayVector<clan::Vec2f>(canvas, 6); gpu_tex1_coords = clan::VertexArrayVector<clan::Vec2f>(canvas, 6); gpu_uniforms = clan::UniformVector<ProgramUniforms>(canvas, 1); gpu_primitives_array = clan::PrimitivesArray(canvas); gpu_primitives_array.set_attributes(0, gpu_positions); gpu_primitives_array.set_attributes(1, gpu_tex1_coords); quit = false; float amount = 0.0f; float timer = 0.0f; float scale = 1.0f; clan::Font font(canvas, "tahoma", 32); blur = 1.0f; clan::ubyte64 startTime = clan::System::get_time(); while (!quit) { timer = (clan::System::get_time() - startTime) / 1000.0f; // Render standard image to offscreen buffer background.draw(canvas_offscreen, 0, 0); ball.draw(canvas_offscreen, canvas.get_width() / 2 + 200 * sinf(timer / 2.0f), canvas.get_height() / 2 + 200 * cosf(timer / 2.0f)); canvas_offscreen.flush(); render_gaussian_blur(canvas_offscreen2, blur, texture_offscreen, shader, 1.0f / texture_offscreen2.get_width(), 0.0f); canvas_offscreen2.flush(); render_gaussian_blur(canvas, blur, texture_offscreen2, shader, 0.0f, 1.0f / texture_offscreen2.get_height()); std::string text( "Press 1 to 9 to control blur amount. Currently it is :" + clan::StringHelp::float_to_text(blur) ); font.draw_text(canvas, 10, 64, text); window.flip(); clan::System::sleep(10); clan::KeepAlive::process(); } return 0; }
App::App() { clan::OpenGLTarget::set_current(); clan::DisplayWindowDescription description; description.set_title("Bloom Shader"); description.set_size(clan::Size(1024, 768), true); window = clan::DisplayWindow(description); canvas = clan::Canvas(window); sc.connect(window.get_keyboard().sig_key_up(), clan::bind_member(this, &App::on_input_up)); sc.connect(window.sig_window_close(), clan::bind_member(this, &App::window_close)); // Create offscreen texture texture_offscreen1 = clan::Texture2D(canvas, canvas.get_width(), canvas.get_height()); texture_offscreen1.set_min_filter(clan::filter_nearest); texture_offscreen1.set_mag_filter(clan::filter_nearest); texture_offscreen2 = clan::Texture2D(canvas, canvas.get_width(), canvas.get_height()); texture_offscreen2.set_min_filter(clan::filter_nearest); texture_offscreen2.set_mag_filter(clan::filter_nearest); texture_offscreen3 = clan::Texture2D(canvas, canvas.get_width(), canvas.get_height()); texture_offscreen3.set_min_filter(clan::filter_nearest); texture_offscreen3.set_mag_filter(clan::filter_nearest); // Create offscreen framebuffer clan::FrameBuffer framebuffer_offscreen1(canvas); framebuffer_offscreen1.attach_color(0, texture_offscreen1); canvas_offscreen1 = clan::Canvas(canvas, framebuffer_offscreen1); clan::FrameBuffer framebuffer_offscreen2(canvas); framebuffer_offscreen2.attach_color(0, texture_offscreen2); canvas_offscreen2 = clan::Canvas(canvas, framebuffer_offscreen2); clan::FrameBuffer framebuffer_offscreen3(canvas); framebuffer_offscreen3.attach_color(0, texture_offscreen3); canvas_offscreen3 = clan::Canvas(canvas, framebuffer_offscreen3); background = clan::Image(canvas, "../PostProcessing/Resources/background.png"); // Load and link shaders gaussian_blur_shader = clan::ProgramObject::load(canvas, "Resources/gaussian_vs.glsl", "Resources/gaussian_fs.glsl"); gaussian_blur_shader.bind_attribute_location(0, "Position"); gaussian_blur_shader.bind_attribute_location(1, "TexCoord0"); gaussian_blur_shader.bind_frag_data_location(0, "cl_FragColor"); if (!gaussian_blur_shader.link()) throw clan::Exception("Unable to link gaussian shader program: Error:" + gaussian_blur_shader.get_info_log()); extract_highlights_shader = clan::ProgramObject::load(canvas, "Resources/highlights_vs.glsl", "Resources/highlights_fs.glsl"); extract_highlights_shader.bind_attribute_location(0, "Position"); extract_highlights_shader.bind_attribute_location(1, "TexCoord0"); //extract_highlights_shader.bind_frag_data_location(0, "cl_FragColor"); if (!extract_highlights_shader.link()) throw clan::Exception("Unable to link hightlights shader program: Error:" + extract_highlights_shader.get_info_log()); bloom_combine_shader = clan::ProgramObject::load(canvas, "Resources/bloom_vs.glsl", "Resources/bloom_fs.glsl"); bloom_combine_shader.bind_attribute_location(0, "Position"); bloom_combine_shader.bind_attribute_location(1, "TexCoord0"); //bloom_combine_shader.bind_frag_data_location(0, "cl_FragColor"); if (!bloom_combine_shader.link()) throw clan::Exception("Unable to link bloom shader program: Error:" + bloom_combine_shader.get_info_log()); gpu_positions = clan::VertexArrayVector<clan::Vec2f>(canvas, 6); gpu_tex1_coords = clan::VertexArrayVector<clan::Vec2f>(canvas, 6); gpu_uniforms = clan::UniformVector<ProgramUniforms>(canvas, 1); gpu_primitives_array = clan::PrimitivesArray(canvas); gpu_primitives_array.set_attributes(0, gpu_positions); gpu_primitives_array.set_attributes(1, gpu_tex1_coords); font = clan::Font("tahoma", 32); select_text = "Default"; startTime = clan::System::get_time(); }