bevy/release-content/migration-guides/fullscreen_shader_resource.md
andriyDev a7fdd6fc6f
Replace FULLSCREEN_SHADER_HANDLE with a FullscreenShader resource. (#19426)
# Objective

- Related to #19024.

## Solution

- Remove the `FULLSCREEN_SHADER_HANDLE` `weak_handle` with a resource
holding the shader handle.
- This also changes us from using `load_internal_asset` to
`embedded_asset`/`load_embedded_asset`.
- All uses have been migrated to clone the `FullscreenShader` resource
and use its `to_vertex_state` method.

## Testing

- `anti_aliasing` example still works.
- `bloom_3d` example still works.

---------

Co-authored-by: charlotte 🌸 <charlotte.c.mcelwain@gmail.com>
2025-06-24 00:02:23 +00:00

1.9 KiB

title: FULLSCREEN_SHADER_HANDLE replaced with FullscreenShader pull_requests: [19426]

FULLSCREEN_SHADER_HANDLE and fullscreen_shader_vertex_state have been replaced by the FullscreenShader resource. Users of either of these will need to call FullscreenShader::shader or FullscreenShader::to_vertex_state respectively. You may need to clone FullscreenShader out of the render world to store an instance that you can use later (e.g., if you are attempting to use the fullscreen shader inside a SpecializedRenderPipeline implementation).

For example, if your previous code looked like this:

struct MyPipeline {
  some_bind_group: BindGroupLayout,
}

impl FromWorld for MyPipeline {
  fn from_world(render_world: &mut World) -> Self {
    let some_bind_group = /* ... RenderDevice stuff */;
    Self {
      some_bind_group,
    }
  }
}

impl SpecializedRenderPipeline for MyPipeline {
  fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor {
    RenderPipelineDescriptor {
      vertex: fullscreen_shader_vertex_state(),
      // ... other stuff
    }
  }
}

You can migrate your code to:

struct MyPipeline {
  some_bind_group: BindGroupLayout,
  fullscreen_shader: FullscreenShader,
}

impl FromWorld for MyPipeline {
  fn from_world(render_world: &mut World) -> Self {
    let some_bind_group = /* ... RenderDevice stuff */;
    Self {
      some_bind_group,
      fullscreen_shader: render_world.resource::<FullscreenShader>().clone(),
    }
  }
}

impl SpecializedRenderPipeline for MyPipeline {
  fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor {
    RenderPipelineDescriptor {
      vertex: self.fullscreen_shader.to_vertex_state(),
      // ... other stuff
    }
  }
}

This is just one example. Pipelines may be initialized in different ways, but the primary strategy is clone out the FullscreenShader resource from the render world, and call to_vertex_state to use it as the vertex shader.