Ejemplo n.º 1
0
static void render()
{
    render_shadowmap();
    render_flag();

    glutSwapBuffers();
}
Ejemplo n.º 2
0
void
Compositor::render(Viewer& viewer)
{
  // render the world, twice if stereo is enabled
  if (true)
  {
    OpenGLState state;

#ifndef HAVE_OPENGLES2
    if (m_render_shadowmap)
    {
      g_shadowmap->bind();
      render_shadowmap(viewer);
      g_shadowmap->unbind();
    }
#endif

    if (m_stereo_mode == StereoMode::None)
    {
      m_renderbuffer1->bind();
      render_scene(viewer, Stereo::Center);
      m_renderbuffer1->unbind();

      m_renderbuffer1->blit(*m_framebuffer1);
    }
    else
    {
      m_renderbuffer1->bind();
      render_scene(viewer, Stereo::Left);
      m_renderbuffer1->unbind();

      m_renderbuffer2->bind();
      render_scene(viewer, Stereo::Right);
      m_renderbuffer2->unbind();

      m_renderbuffer1->blit(*m_framebuffer1);
      m_renderbuffer2->blit(*m_framebuffer2);
    }
  }

  // composit the final image
  if (true)
  {
    OpenGLState state;

    MaterialPtr material = std::make_shared<Material>();
    { // setup material
      material->set_program(m_composition_prog);

      material->set_uniform("MVP", UniformSymbol::ModelViewProjectionMatrix);

      material->set_uniform("barrel_power", m_barrel_power);
      material->set_uniform("left_eye",  0);
      material->set_uniform("right_eye", 1);

      if (!viewer.m_cfg.m_show_calibration)
      {
        material->set_texture(0, m_framebuffer1->get_color_texture());
        material->set_texture(1, m_framebuffer2->get_color_texture());
      }
      else
      {
        material->set_texture(0, m_calibration_left_texture);
        material->set_texture(1, m_calibration_right_texture);
      }

      m_viewport_offset = {0, 0};
      switch(m_stereo_mode)
      {
        case StereoMode::Cybermaxx:
          m_viewport_offset = {-41, 16};
          m_composition_prog = m_cybermaxx_prog;
          break;

        case StereoMode::CrossEye:
          m_composition_prog = m_crosseye_prog;
          break;

        case StereoMode::Anaglyph:
          m_composition_prog = m_anaglyph_prog;
          break;

        case StereoMode::Depth:
          material->set_texture(0, m_framebuffer1->get_depth_texture());
          m_composition_prog = m_depth_prog;
          break;

        case StereoMode::Newsprint:
          m_composition_prog = m_newsprint_prog;
          break;

        default:
          m_composition_prog = m_mono_prog;
          break;
      }
    } // setup material

    ModelPtr model = std::make_shared<Model>();
    model->add_mesh(Mesh::create_rect(0.0f, 0.0f, m_screen_w, m_screen_h, -20.0f));
    model->set_material(material);

    Camera camera;
    camera.ortho(0, m_screen_w, m_screen_h, 0.0f, 0.1f, 10000.0f);

    SceneManager mgr;
    mgr.get_world()->attach_model(model);

    RenderContext ctx(camera, mgr.get_world());

    glViewport(m_viewport_offset.x, m_viewport_offset.y, m_screen_w, m_screen_h);

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    mgr.render(camera);

    render_menu(ctx, viewer);
  }

  assert_gl("display:exit()");
}