Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
61a1e0c
Implement per-pixel linked list for OIT
beicause Nov 14, 2025
8a3c399
update
beicause Nov 14, 2025
7ebd383
Fix
beicause Nov 14, 2025
9d0dbc3
make use of depth prepass to filter out fragments
beicause Nov 16, 2025
c414d2e
Fix corrupted linked list on startup
beicause Nov 16, 2025
395acf0
change OIT default value
beicause Nov 26, 2025
a2583f6
Sort in desc order and fix early termination in blending
beicause Nov 26, 2025
cd963ea
Merge remote-tracking branch 'upstream' into oit-opt
beicause Nov 26, 2025
6398884
format
beicause Nov 26, 2025
a8028b5
fmt
beicause Dec 6, 2025
ae57011
Merge remote-tracking branch 'upstream' into oit-opt
beicause Dec 6, 2025
1fbeaa7
Merge remote-tracking branch 'upstream' into oit-opt
beicause Jan 9, 2026
2babad2
Rename header -> head
beicause Jan 9, 2026
0290b64
Add some methods and optimizations in buffer vec
beicause Jan 10, 2026
c07054a
Avoid writing oit heads buffer by offseting values by 1
beicause Jan 10, 2026
41fb34a
Save local memory for sorted frags
beicause Jan 12, 2026
fe52562
Merge remote-tracking branch 'upstream/main' into oit-opt
beicause Jan 12, 2026
545d99a
Store packed depth and alpha to save local memory
goodartistscopy Jan 12, 2026
77c783d
Swap depth/alpha in packed repr. to make it monotonic with depth
goodartistscopy Jan 12, 2026
47b9642
Finalize previous commit
goodartistscopy Jan 12, 2026
706529f
Merge branch 'oit-depth-opt' into oit-opt
beicause Jan 12, 2026
1c68b0d
beicause Jan 12, 2026
e98bee5
Merge remote-tracking branch 'upstream/main' into oit-opt
beicause Jan 29, 2026
a97aa85
Fix merging
beicause Jan 29, 2026
ab1e342
Merge remote-tracking branch 'upstream/main' into oit-opt
beicause Feb 5, 2026
e955608
docs, rm unnecessary clone
beicause Feb 5, 2026
4c7c38e
Bind oit nodes buffer capacity
beicause Feb 5, 2026
23feaa2
Release oit buffers if no camera enables OIT
beicause Feb 5, 2026
2b3dd5f
Resize oit buffers instead of reserve when changed
beicause Feb 5, 2026
d455ee5
CI
beicause Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
use crate::core_3d::Transparent3d;
use crate::{
core_3d::Transparent3d,
oit::{resolve::OitResolvePipelineId, OrderIndependentTransparencySettings},
};
use bevy_camera::{MainPassResolutionOverride, Viewport};
use bevy_ecs::prelude::*;
use bevy_render::{
camera::ExtractedCamera,
diagnostic::RecordDiagnostics,
render_phase::ViewSortedRenderPhases,
render_resource::{RenderPassDescriptor, StoreOp},
render_resource::{PipelineCache, RenderPassDescriptor, StoreOp},
renderer::{RenderContext, ViewQuery},
view::{ExtractedView, ViewDepthTexture, ViewTarget},
};
Expand All @@ -21,13 +24,23 @@ pub fn main_transparent_pass_3d(
&ViewTarget,
&ViewDepthTexture,
Option<&MainPassResolutionOverride>,
Has<OrderIndependentTransparencySettings>,
Option<&OitResolvePipelineId>,
)>,
transparent_phases: Res<ViewSortedRenderPhases<Transparent3d>>,
mut ctx: RenderContext,
) {
let view_entity = view.entity();

let (camera, extracted_view, target, depth, resolution_override) = view.into_inner();
let (
camera,
extracted_view,
target,
depth,
resolution_override,
has_oit,
oit_resolve_pipeline_id,
) = view.into_inner();

let Some(transparent_phase) = transparent_phases.get(&extracted_view.retained_view_entity)
else {
Expand All @@ -41,6 +54,22 @@ pub fn main_transparent_pass_3d(
let diagnostics = ctx.diagnostic_recorder();
let diagnostics = diagnostics.as_deref();

if has_oit {
// We can't run transparent phase if OitResolvePipelineId is not ready
// Otherwise we will write to `oit_atomic_counter` and `oit_heads` buffer without resetting them
// which causes corrupted linked list(can have circular references) on the next pass
let Some(oit_resolve_pipeline_id) = oit_resolve_pipeline_id else {
return;
};
let pipeline_cache = world.resource::<PipelineCache>();
if pipeline_cache
.get_render_pipeline(oit_resolve_pipeline_id.0)
.is_none()
{
return;
}
}

let mut render_pass = ctx.begin_tracked_render_pass(RenderPassDescriptor {
label: Some("main_transparent_pass_3d"),
color_attachments: &[Some(target.get_color_attachment())],
Expand Down
Loading