Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Postprocessing #189

Open
voxelias opened this issue Apr 19, 2023 · 0 comments
Open

Postprocessing #189

voxelias opened this issue Apr 19, 2023 · 0 comments
Assignees

Comments

@voxelias
Copy link
Member

Check two tasks:

  1. dotrix_pbr::EncodeTask -> it provides following output: type Output = gpu::Commands;
  2. dotrix_gpu::SubmitCommands -> it takes gpu::Commands from all tasks, sorts them according to priority and executes. As an output, there will be type Output = FrameOutput that has already the ready frame texture.

The gpu::Commands are important. They cover different rendering parts:

  1. Clear up the frame
  2. Render skybox/skydome
  3. Render terrain
  4. Render all PBR objects
  5. Optional post-processing of the 3D scene
  6. Render overlay (UI)
  7. Optional post-processing that will affect UI too

Each task that provides gpu::Commands also defines their priority:

encoder.finish(self.priority)

Using the priority you can affect the order of commands.

In other words, post-processing could be just a new task, that will encode appropriate commands with selected effects.

  • This brings us to a concept of a new dotrix_postprocess crate, that should be created as a result of this issue.
  • The crate will provide some data structure called PostProcess that will implement configuration for the effects.
  • A user can create a new task in his/her app, that will run under user-defined conditions (state, dependencies etc) with specific post-processing effect and then encode the commands with selected priority.
pub struct PlayerDrunkEffect {
    post_processing: PostProcessing,
}

impl PlayerDrunkEffect {
  pub fn new(render_priority: u32) -> Self {
    Self {
      post_processing: PostProcessing { 
        render_priority,
         ...configure the drunk effect
      }
    }
  }
}

impl dotrix::Task for UiTask {
    type Context = (dotrix::Any<dotrix::Gpu>, dotrix::Any<dotrix::Frame>);
    type Output = gpu::Commands;
    fn run(&mut self, (gpu, frame): Self::Context) -> Self::Output {
      self.post_processing.encode(gpu, frame)
    }
}

The only technical complication that is left to solve is double frame buffer. Current frame texture is stored in dotrix_gpu::Gpu::frame_texture. We will need to solve where we render what and when and which one we display in the end :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants