Fix multisampling on web

This commit is contained in:
Nikita Lisitsa 2026-07-07 13:12:23 +03:00
parent ce4fc68fe2
commit 047c48e670

View file

@ -1,6 +1,8 @@
#include <psemek/app/default_application_factory.hpp>
#include <psemek/gfx/gl.hpp>
#include <psemek/gfx/painter.hpp>
#include <psemek/gfx/framebuffer.hpp>
#include <psemek/gfx/renderbuffer.hpp>
#include <psemek/util/array.hpp>
#include <psemek/random/generator.hpp>
#include <psemek/random/device.hpp>
@ -1503,6 +1505,8 @@ namespace gmtk
pop_ = audio::load_mp3(io::read_full(std::move(*app::open_resource("sounds/pop.mp3"))));
error_ = audio::load_mp3(io::read_full(std::move(*app::open_resource("sounds/error.mp3"))));
resolve_texture_.nearest_filter();
context_.windowed(is_windowed_);
init_menu();
}
@ -1510,6 +1514,14 @@ namespace gmtk
void on_event(app::resize_event const & event) override
{
screen_size_ = event.size;
multisample_renderbuffer_.storage<gfx::color_rgba>(math::cast<std::size_t>(event.size), 4);
multisample_framebuffer_.color(multisample_renderbuffer_);
multisample_framebuffer_.assert_complete("multisample");
resolve_texture_.load<gfx::color_rgba>(math::cast<std::size_t>(event.size));
resolve_framebuffer_.color(resolve_texture_);
resolve_framebuffer_.assert_complete("resolve");
}
void on_event(app::touch_down_event const & event) override
@ -2144,6 +2156,8 @@ namespace gmtk
void present() override
{
multisample_framebuffer_.bind();
gl::ClearColor(1.f, 1.f, 1.f, 1.f);
gl::Clear(gl::COLOR_BUFFER_BIT);
@ -2548,6 +2562,17 @@ namespace gmtk
}
painter_.render(math::orthographic_camera{view_box_}.transform());
multisample_framebuffer_.bind_read();
resolve_framebuffer_.bind();
gl::Clear(gl::COLOR_BUFFER_BIT);
gl::BlitFramebuffer(0, 0, screen_size_[0], screen_size_[1], 0, 0, screen_size_[0], screen_size_[1], gl::COLOR_BUFFER_BIT, gl::NEAREST);
gfx::framebuffer::null().bind();
painter_.texture(resolve_texture_, {{{-1.f, 1.f}, {-1.f, 1.f}}});
painter_.render(math::matrix<float, 4, 4>::identity());
}
private:
@ -2746,6 +2771,12 @@ namespace gmtk
gfx::painter painter_;
gfx::framebuffer multisample_framebuffer_;
gfx::renderbuffer multisample_renderbuffer_;
gfx::framebuffer resolve_framebuffer_;
gfx::texture_2d resolve_texture_;
struct view_transition
{
location old;
@ -2937,6 +2968,7 @@ namespace psemek::app
application::options options
{
.name = "Color Fractory",
.multisampling = 0,
};
return default_application_factory<gmtk::application>(options);