2024-03-25 19:08:27 +00:00
|
|
|
#define_import_path bevy_pbr::meshlet_visibility_buffer_resolve
|
|
|
|
|
|
|
|
#import bevy_pbr::{
|
|
|
|
meshlet_bindings::{
|
|
|
|
meshlet_visibility_buffer,
|
2024-05-04 19:56:19 +00:00
|
|
|
meshlet_cluster_meshlet_ids,
|
2024-03-25 19:08:27 +00:00
|
|
|
meshlets,
|
|
|
|
meshlet_vertex_ids,
|
|
|
|
meshlet_vertex_data,
|
2024-05-04 19:56:19 +00:00
|
|
|
meshlet_cluster_instance_ids,
|
2024-03-25 19:08:27 +00:00
|
|
|
meshlet_instance_uniforms,
|
|
|
|
get_meshlet_index,
|
|
|
|
unpack_meshlet_vertex,
|
|
|
|
},
|
|
|
|
mesh_view_bindings::view,
|
|
|
|
mesh_functions::mesh_position_local_to_world,
|
|
|
|
mesh_types::MESH_FLAGS_SIGN_DETERMINANT_MODEL_3X3_BIT,
|
|
|
|
view_transformations::{position_world_to_clip, frag_coord_to_ndc},
|
|
|
|
}
|
|
|
|
#import bevy_render::maths::{affine3_to_square, mat2x4_f32_to_mat3x3_unpack}
|
|
|
|
|
|
|
|
#ifdef PREPASS_FRAGMENT
|
|
|
|
#ifdef MOTION_VECTOR_PREPASS
|
|
|
|
#import bevy_pbr::{
|
2024-04-07 18:59:16 +00:00
|
|
|
prepass_bindings::previous_view_uniforms,
|
2024-03-25 19:08:27 +00:00
|
|
|
pbr_prepass_functions::calculate_motion_vector,
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/// Functions to be used by materials for reading from a meshlet visibility buffer texture.
|
|
|
|
|
|
|
|
#ifdef MESHLET_MESH_MATERIAL_PASS
|
|
|
|
struct PartialDerivatives {
|
|
|
|
barycentrics: vec3<f32>,
|
|
|
|
ddx: vec3<f32>,
|
|
|
|
ddy: vec3<f32>,
|
|
|
|
}
|
|
|
|
|
|
|
|
// https://github.com/ConfettiFX/The-Forge/blob/2d453f376ef278f66f97cbaf36c0d12e4361e275/Examples_3/Visibility_Buffer/src/Shaders/FSL/visibilityBuffer_shade.frag.fsl#L83-L139
|
|
|
|
fn compute_partial_derivatives(vertex_clip_positions: array<vec4<f32>, 3>, ndc_uv: vec2<f32>, screen_size: vec2<f32>) -> PartialDerivatives {
|
|
|
|
var result: PartialDerivatives;
|
|
|
|
|
|
|
|
let inv_w = 1.0 / vec3(vertex_clip_positions[0].w, vertex_clip_positions[1].w, vertex_clip_positions[2].w);
|
|
|
|
let ndc_0 = vertex_clip_positions[0].xy * inv_w[0];
|
|
|
|
let ndc_1 = vertex_clip_positions[1].xy * inv_w[1];
|
|
|
|
let ndc_2 = vertex_clip_positions[2].xy * inv_w[2];
|
|
|
|
|
|
|
|
let inv_det = 1.0 / determinant(mat2x2(ndc_2 - ndc_1, ndc_0 - ndc_1));
|
|
|
|
result.ddx = vec3(ndc_1.y - ndc_2.y, ndc_2.y - ndc_0.y, ndc_0.y - ndc_1.y) * inv_det * inv_w;
|
|
|
|
result.ddy = vec3(ndc_2.x - ndc_1.x, ndc_0.x - ndc_2.x, ndc_1.x - ndc_0.x) * inv_det * inv_w;
|
|
|
|
|
|
|
|
var ddx_sum = dot(result.ddx, vec3(1.0));
|
|
|
|
var ddy_sum = dot(result.ddy, vec3(1.0));
|
|
|
|
|
|
|
|
let delta_v = ndc_uv - ndc_0;
|
|
|
|
let interp_inv_w = inv_w.x + delta_v.x * ddx_sum + delta_v.y * ddy_sum;
|
|
|
|
let interp_w = 1.0 / interp_inv_w;
|
|
|
|
|
|
|
|
result.barycentrics = vec3(
|
|
|
|
interp_w * (delta_v.x * result.ddx.x + delta_v.y * result.ddy.x + inv_w.x),
|
|
|
|
interp_w * (delta_v.x * result.ddx.y + delta_v.y * result.ddy.y),
|
|
|
|
interp_w * (delta_v.x * result.ddx.z + delta_v.y * result.ddy.z),
|
|
|
|
);
|
|
|
|
|
|
|
|
result.ddx *= 2.0 / screen_size.x;
|
|
|
|
result.ddy *= 2.0 / screen_size.y;
|
|
|
|
ddx_sum *= 2.0 / screen_size.x;
|
|
|
|
ddy_sum *= 2.0 / screen_size.y;
|
|
|
|
|
|
|
|
let interp_ddx_w = 1.0 / (interp_inv_w + ddx_sum);
|
|
|
|
let interp_ddy_w = 1.0 / (interp_inv_w + ddy_sum);
|
|
|
|
|
|
|
|
result.ddx = interp_ddx_w * (result.barycentrics * interp_inv_w + result.ddx) - result.barycentrics;
|
|
|
|
result.ddy = interp_ddy_w * (result.barycentrics * interp_inv_w + result.ddy) - result.barycentrics;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct VertexOutput {
|
|
|
|
position: vec4<f32>,
|
|
|
|
world_position: vec4<f32>,
|
|
|
|
world_normal: vec3<f32>,
|
|
|
|
uv: vec2<f32>,
|
|
|
|
ddx_uv: vec2<f32>,
|
|
|
|
ddy_uv: vec2<f32>,
|
|
|
|
world_tangent: vec4<f32>,
|
|
|
|
mesh_flags: u32,
|
|
|
|
meshlet_id: u32,
|
|
|
|
#ifdef PREPASS_FRAGMENT
|
|
|
|
#ifdef MOTION_VECTOR_PREPASS
|
|
|
|
motion_vector: vec2<f32>,
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Load the visibility buffer texture and resolve it into a VertexOutput.
|
|
|
|
fn resolve_vertex_output(frag_coord: vec4<f32>) -> VertexOutput {
|
2024-05-04 19:56:19 +00:00
|
|
|
let packed_ids = textureLoad(meshlet_visibility_buffer, vec2<i32>(frag_coord.xy), 0).r;
|
|
|
|
let cluster_id = packed_ids >> 6u;
|
|
|
|
let meshlet_id = meshlet_cluster_meshlet_ids[cluster_id];
|
2024-03-25 19:08:27 +00:00
|
|
|
let meshlet = meshlets[meshlet_id];
|
2024-05-04 19:56:19 +00:00
|
|
|
let triangle_id = extractBits(packed_ids, 0u, 6u);
|
2024-03-25 19:08:27 +00:00
|
|
|
let index_ids = meshlet.start_index_id + vec3(triangle_id * 3u) + vec3(0u, 1u, 2u);
|
|
|
|
let indices = meshlet.start_vertex_id + vec3(get_meshlet_index(index_ids.x), get_meshlet_index(index_ids.y), get_meshlet_index(index_ids.z));
|
|
|
|
let vertex_ids = vec3(meshlet_vertex_ids[indices.x], meshlet_vertex_ids[indices.y], meshlet_vertex_ids[indices.z]);
|
|
|
|
let vertex_1 = unpack_meshlet_vertex(meshlet_vertex_data[vertex_ids.x]);
|
|
|
|
let vertex_2 = unpack_meshlet_vertex(meshlet_vertex_data[vertex_ids.y]);
|
|
|
|
let vertex_3 = unpack_meshlet_vertex(meshlet_vertex_data[vertex_ids.z]);
|
|
|
|
|
2024-05-04 19:56:19 +00:00
|
|
|
let instance_id = meshlet_cluster_instance_ids[cluster_id];
|
2024-03-25 19:08:27 +00:00
|
|
|
let instance_uniform = meshlet_instance_uniforms[instance_id];
|
Normalise matrix naming (#13489)
# Objective
- Fixes #10909
- Fixes #8492
## Solution
- Name all matrices `x_from_y`, for example `world_from_view`.
## Testing
- I've tested most of the 3D examples. The `lighting` example
particularly should hit a lot of the changes and appears to run fine.
---
## Changelog
- Renamed matrices across the engine to follow a `y_from_x` naming,
making the space conversion more obvious.
## Migration Guide
- `Frustum`'s `from_view_projection`, `from_view_projection_custom_far`
and `from_view_projection_no_far` were renamed to
`from_clip_from_world`, `from_clip_from_world_custom_far` and
`from_clip_from_world_no_far`.
- `ComputedCameraValues::projection_matrix` was renamed to
`clip_from_view`.
- `CameraProjection::get_projection_matrix` was renamed to
`get_clip_from_view` (this affects implementations on `Projection`,
`PerspectiveProjection` and `OrthographicProjection`).
- `ViewRangefinder3d::from_view_matrix` was renamed to
`from_world_from_view`.
- `PreviousViewData`'s members were renamed to `view_from_world` and
`clip_from_world`.
- `ExtractedView`'s `projection`, `transform` and `view_projection` were
renamed to `clip_from_view`, `world_from_view` and `clip_from_world`.
- `ViewUniform`'s `view_proj`, `unjittered_view_proj`,
`inverse_view_proj`, `view`, `inverse_view`, `projection` and
`inverse_projection` were renamed to `clip_from_world`,
`unjittered_clip_from_world`, `world_from_clip`, `world_from_view`,
`view_from_world`, `clip_from_view` and `view_from_clip`.
- `GpuDirectionalCascade::view_projection` was renamed to
`clip_from_world`.
- `MeshTransforms`' `transform` and `previous_transform` were renamed to
`world_from_local` and `previous_world_from_local`.
- `MeshUniform`'s `transform`, `previous_transform`,
`inverse_transpose_model_a` and `inverse_transpose_model_b` were renamed
to `world_from_local`, `previous_world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh` type in WGSL mirrors this, however `transform` and
`previous_transform` were named `model` and `previous_model`).
- `Mesh2dTransforms::transform` was renamed to `world_from_local`.
- `Mesh2dUniform`'s `transform`, `inverse_transpose_model_a` and
`inverse_transpose_model_b` were renamed to `world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh2d` type in WGSL mirrors this).
- In WGSL, in `bevy_pbr::mesh_functions`, `get_model_matrix` and
`get_previous_model_matrix` were renamed to `get_world_from_local` and
`get_previous_world_from_local`.
- In WGSL, `bevy_sprite::mesh2d_functions::get_model_matrix` was renamed
to `get_world_from_local`.
2024-06-03 16:56:53 +00:00
|
|
|
let world_from_local = affine3_to_square(instance_uniform.world_from_local);
|
2024-03-25 19:08:27 +00:00
|
|
|
|
Normalise matrix naming (#13489)
# Objective
- Fixes #10909
- Fixes #8492
## Solution
- Name all matrices `x_from_y`, for example `world_from_view`.
## Testing
- I've tested most of the 3D examples. The `lighting` example
particularly should hit a lot of the changes and appears to run fine.
---
## Changelog
- Renamed matrices across the engine to follow a `y_from_x` naming,
making the space conversion more obvious.
## Migration Guide
- `Frustum`'s `from_view_projection`, `from_view_projection_custom_far`
and `from_view_projection_no_far` were renamed to
`from_clip_from_world`, `from_clip_from_world_custom_far` and
`from_clip_from_world_no_far`.
- `ComputedCameraValues::projection_matrix` was renamed to
`clip_from_view`.
- `CameraProjection::get_projection_matrix` was renamed to
`get_clip_from_view` (this affects implementations on `Projection`,
`PerspectiveProjection` and `OrthographicProjection`).
- `ViewRangefinder3d::from_view_matrix` was renamed to
`from_world_from_view`.
- `PreviousViewData`'s members were renamed to `view_from_world` and
`clip_from_world`.
- `ExtractedView`'s `projection`, `transform` and `view_projection` were
renamed to `clip_from_view`, `world_from_view` and `clip_from_world`.
- `ViewUniform`'s `view_proj`, `unjittered_view_proj`,
`inverse_view_proj`, `view`, `inverse_view`, `projection` and
`inverse_projection` were renamed to `clip_from_world`,
`unjittered_clip_from_world`, `world_from_clip`, `world_from_view`,
`view_from_world`, `clip_from_view` and `view_from_clip`.
- `GpuDirectionalCascade::view_projection` was renamed to
`clip_from_world`.
- `MeshTransforms`' `transform` and `previous_transform` were renamed to
`world_from_local` and `previous_world_from_local`.
- `MeshUniform`'s `transform`, `previous_transform`,
`inverse_transpose_model_a` and `inverse_transpose_model_b` were renamed
to `world_from_local`, `previous_world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh` type in WGSL mirrors this, however `transform` and
`previous_transform` were named `model` and `previous_model`).
- `Mesh2dTransforms::transform` was renamed to `world_from_local`.
- `Mesh2dUniform`'s `transform`, `inverse_transpose_model_a` and
`inverse_transpose_model_b` were renamed to `world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh2d` type in WGSL mirrors this).
- In WGSL, in `bevy_pbr::mesh_functions`, `get_model_matrix` and
`get_previous_model_matrix` were renamed to `get_world_from_local` and
`get_previous_world_from_local`.
- In WGSL, `bevy_sprite::mesh2d_functions::get_model_matrix` was renamed
to `get_world_from_local`.
2024-06-03 16:56:53 +00:00
|
|
|
let world_position_1 = mesh_position_local_to_world(world_from_local, vec4(vertex_1.position, 1.0));
|
|
|
|
let world_position_2 = mesh_position_local_to_world(world_from_local, vec4(vertex_2.position, 1.0));
|
|
|
|
let world_position_3 = mesh_position_local_to_world(world_from_local, vec4(vertex_3.position, 1.0));
|
2024-05-04 19:56:19 +00:00
|
|
|
|
2024-03-25 19:08:27 +00:00
|
|
|
let clip_position_1 = position_world_to_clip(world_position_1.xyz);
|
|
|
|
let clip_position_2 = position_world_to_clip(world_position_2.xyz);
|
|
|
|
let clip_position_3 = position_world_to_clip(world_position_3.xyz);
|
|
|
|
let frag_coord_ndc = frag_coord_to_ndc(frag_coord).xy;
|
|
|
|
let partial_derivatives = compute_partial_derivatives(
|
|
|
|
array(clip_position_1, clip_position_2, clip_position_3),
|
|
|
|
frag_coord_ndc,
|
|
|
|
view.viewport.zw,
|
|
|
|
);
|
|
|
|
|
|
|
|
let world_position = mat3x4(world_position_1, world_position_2, world_position_3) * partial_derivatives.barycentrics;
|
|
|
|
let vertex_normal = mat3x3(vertex_1.normal, vertex_2.normal, vertex_3.normal) * partial_derivatives.barycentrics;
|
|
|
|
let world_normal = normalize(
|
|
|
|
mat2x4_f32_to_mat3x3_unpack(
|
Normalise matrix naming (#13489)
# Objective
- Fixes #10909
- Fixes #8492
## Solution
- Name all matrices `x_from_y`, for example `world_from_view`.
## Testing
- I've tested most of the 3D examples. The `lighting` example
particularly should hit a lot of the changes and appears to run fine.
---
## Changelog
- Renamed matrices across the engine to follow a `y_from_x` naming,
making the space conversion more obvious.
## Migration Guide
- `Frustum`'s `from_view_projection`, `from_view_projection_custom_far`
and `from_view_projection_no_far` were renamed to
`from_clip_from_world`, `from_clip_from_world_custom_far` and
`from_clip_from_world_no_far`.
- `ComputedCameraValues::projection_matrix` was renamed to
`clip_from_view`.
- `CameraProjection::get_projection_matrix` was renamed to
`get_clip_from_view` (this affects implementations on `Projection`,
`PerspectiveProjection` and `OrthographicProjection`).
- `ViewRangefinder3d::from_view_matrix` was renamed to
`from_world_from_view`.
- `PreviousViewData`'s members were renamed to `view_from_world` and
`clip_from_world`.
- `ExtractedView`'s `projection`, `transform` and `view_projection` were
renamed to `clip_from_view`, `world_from_view` and `clip_from_world`.
- `ViewUniform`'s `view_proj`, `unjittered_view_proj`,
`inverse_view_proj`, `view`, `inverse_view`, `projection` and
`inverse_projection` were renamed to `clip_from_world`,
`unjittered_clip_from_world`, `world_from_clip`, `world_from_view`,
`view_from_world`, `clip_from_view` and `view_from_clip`.
- `GpuDirectionalCascade::view_projection` was renamed to
`clip_from_world`.
- `MeshTransforms`' `transform` and `previous_transform` were renamed to
`world_from_local` and `previous_world_from_local`.
- `MeshUniform`'s `transform`, `previous_transform`,
`inverse_transpose_model_a` and `inverse_transpose_model_b` were renamed
to `world_from_local`, `previous_world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh` type in WGSL mirrors this, however `transform` and
`previous_transform` were named `model` and `previous_model`).
- `Mesh2dTransforms::transform` was renamed to `world_from_local`.
- `Mesh2dUniform`'s `transform`, `inverse_transpose_model_a` and
`inverse_transpose_model_b` were renamed to `world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh2d` type in WGSL mirrors this).
- In WGSL, in `bevy_pbr::mesh_functions`, `get_model_matrix` and
`get_previous_model_matrix` were renamed to `get_world_from_local` and
`get_previous_world_from_local`.
- In WGSL, `bevy_sprite::mesh2d_functions::get_model_matrix` was renamed
to `get_world_from_local`.
2024-06-03 16:56:53 +00:00
|
|
|
instance_uniform.local_from_world_transpose_a,
|
|
|
|
instance_uniform.local_from_world_transpose_b,
|
2024-03-25 19:08:27 +00:00
|
|
|
) * vertex_normal
|
|
|
|
);
|
|
|
|
let uv = mat3x2(vertex_1.uv, vertex_2.uv, vertex_3.uv) * partial_derivatives.barycentrics;
|
|
|
|
let ddx_uv = mat3x2(vertex_1.uv, vertex_2.uv, vertex_3.uv) * partial_derivatives.ddx;
|
|
|
|
let ddy_uv = mat3x2(vertex_1.uv, vertex_2.uv, vertex_3.uv) * partial_derivatives.ddy;
|
|
|
|
let vertex_tangent = mat3x4(vertex_1.tangent, vertex_2.tangent, vertex_3.tangent) * partial_derivatives.barycentrics;
|
|
|
|
let world_tangent = vec4(
|
|
|
|
normalize(
|
|
|
|
mat3x3(
|
Normalise matrix naming (#13489)
# Objective
- Fixes #10909
- Fixes #8492
## Solution
- Name all matrices `x_from_y`, for example `world_from_view`.
## Testing
- I've tested most of the 3D examples. The `lighting` example
particularly should hit a lot of the changes and appears to run fine.
---
## Changelog
- Renamed matrices across the engine to follow a `y_from_x` naming,
making the space conversion more obvious.
## Migration Guide
- `Frustum`'s `from_view_projection`, `from_view_projection_custom_far`
and `from_view_projection_no_far` were renamed to
`from_clip_from_world`, `from_clip_from_world_custom_far` and
`from_clip_from_world_no_far`.
- `ComputedCameraValues::projection_matrix` was renamed to
`clip_from_view`.
- `CameraProjection::get_projection_matrix` was renamed to
`get_clip_from_view` (this affects implementations on `Projection`,
`PerspectiveProjection` and `OrthographicProjection`).
- `ViewRangefinder3d::from_view_matrix` was renamed to
`from_world_from_view`.
- `PreviousViewData`'s members were renamed to `view_from_world` and
`clip_from_world`.
- `ExtractedView`'s `projection`, `transform` and `view_projection` were
renamed to `clip_from_view`, `world_from_view` and `clip_from_world`.
- `ViewUniform`'s `view_proj`, `unjittered_view_proj`,
`inverse_view_proj`, `view`, `inverse_view`, `projection` and
`inverse_projection` were renamed to `clip_from_world`,
`unjittered_clip_from_world`, `world_from_clip`, `world_from_view`,
`view_from_world`, `clip_from_view` and `view_from_clip`.
- `GpuDirectionalCascade::view_projection` was renamed to
`clip_from_world`.
- `MeshTransforms`' `transform` and `previous_transform` were renamed to
`world_from_local` and `previous_world_from_local`.
- `MeshUniform`'s `transform`, `previous_transform`,
`inverse_transpose_model_a` and `inverse_transpose_model_b` were renamed
to `world_from_local`, `previous_world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh` type in WGSL mirrors this, however `transform` and
`previous_transform` were named `model` and `previous_model`).
- `Mesh2dTransforms::transform` was renamed to `world_from_local`.
- `Mesh2dUniform`'s `transform`, `inverse_transpose_model_a` and
`inverse_transpose_model_b` were renamed to `world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh2d` type in WGSL mirrors this).
- In WGSL, in `bevy_pbr::mesh_functions`, `get_model_matrix` and
`get_previous_model_matrix` were renamed to `get_world_from_local` and
`get_previous_world_from_local`.
- In WGSL, `bevy_sprite::mesh2d_functions::get_model_matrix` was renamed
to `get_world_from_local`.
2024-06-03 16:56:53 +00:00
|
|
|
world_from_local[0].xyz,
|
|
|
|
world_from_local[1].xyz,
|
|
|
|
world_from_local[2].xyz
|
2024-03-25 19:08:27 +00:00
|
|
|
) * vertex_tangent.xyz
|
|
|
|
),
|
|
|
|
vertex_tangent.w * (f32(bool(instance_uniform.flags & MESH_FLAGS_SIGN_DETERMINANT_MODEL_3X3_BIT)) * 2.0 - 1.0)
|
|
|
|
);
|
|
|
|
|
|
|
|
#ifdef PREPASS_FRAGMENT
|
|
|
|
#ifdef MOTION_VECTOR_PREPASS
|
Normalise matrix naming (#13489)
# Objective
- Fixes #10909
- Fixes #8492
## Solution
- Name all matrices `x_from_y`, for example `world_from_view`.
## Testing
- I've tested most of the 3D examples. The `lighting` example
particularly should hit a lot of the changes and appears to run fine.
---
## Changelog
- Renamed matrices across the engine to follow a `y_from_x` naming,
making the space conversion more obvious.
## Migration Guide
- `Frustum`'s `from_view_projection`, `from_view_projection_custom_far`
and `from_view_projection_no_far` were renamed to
`from_clip_from_world`, `from_clip_from_world_custom_far` and
`from_clip_from_world_no_far`.
- `ComputedCameraValues::projection_matrix` was renamed to
`clip_from_view`.
- `CameraProjection::get_projection_matrix` was renamed to
`get_clip_from_view` (this affects implementations on `Projection`,
`PerspectiveProjection` and `OrthographicProjection`).
- `ViewRangefinder3d::from_view_matrix` was renamed to
`from_world_from_view`.
- `PreviousViewData`'s members were renamed to `view_from_world` and
`clip_from_world`.
- `ExtractedView`'s `projection`, `transform` and `view_projection` were
renamed to `clip_from_view`, `world_from_view` and `clip_from_world`.
- `ViewUniform`'s `view_proj`, `unjittered_view_proj`,
`inverse_view_proj`, `view`, `inverse_view`, `projection` and
`inverse_projection` were renamed to `clip_from_world`,
`unjittered_clip_from_world`, `world_from_clip`, `world_from_view`,
`view_from_world`, `clip_from_view` and `view_from_clip`.
- `GpuDirectionalCascade::view_projection` was renamed to
`clip_from_world`.
- `MeshTransforms`' `transform` and `previous_transform` were renamed to
`world_from_local` and `previous_world_from_local`.
- `MeshUniform`'s `transform`, `previous_transform`,
`inverse_transpose_model_a` and `inverse_transpose_model_b` were renamed
to `world_from_local`, `previous_world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh` type in WGSL mirrors this, however `transform` and
`previous_transform` were named `model` and `previous_model`).
- `Mesh2dTransforms::transform` was renamed to `world_from_local`.
- `Mesh2dUniform`'s `transform`, `inverse_transpose_model_a` and
`inverse_transpose_model_b` were renamed to `world_from_local`,
`local_from_world_transpose_a` and `local_from_world_transpose_b` (the
`Mesh2d` type in WGSL mirrors this).
- In WGSL, in `bevy_pbr::mesh_functions`, `get_model_matrix` and
`get_previous_model_matrix` were renamed to `get_world_from_local` and
`get_previous_world_from_local`.
- In WGSL, `bevy_sprite::mesh2d_functions::get_model_matrix` was renamed
to `get_world_from_local`.
2024-06-03 16:56:53 +00:00
|
|
|
let previous_world_from_local = affine3_to_square(instance_uniform.previous_world_from_local);
|
|
|
|
let previous_world_position_1 = mesh_position_local_to_world(previous_world_from_local, vec4(vertex_1.position, 1.0));
|
|
|
|
let previous_world_position_2 = mesh_position_local_to_world(previous_world_from_local, vec4(vertex_2.position, 1.0));
|
|
|
|
let previous_world_position_3 = mesh_position_local_to_world(previous_world_from_local, vec4(vertex_3.position, 1.0));
|
|
|
|
let previous_clip_position_1 = previous_view_uniforms.clip_from_world * vec4(previous_world_position_1.xyz, 1.0);
|
|
|
|
let previous_clip_position_2 = previous_view_uniforms.clip_from_world * vec4(previous_world_position_2.xyz, 1.0);
|
|
|
|
let previous_clip_position_3 = previous_view_uniforms.clip_from_world * vec4(previous_world_position_3.xyz, 1.0);
|
2024-03-25 19:08:27 +00:00
|
|
|
let previous_partial_derivatives = compute_partial_derivatives(
|
|
|
|
array(previous_clip_position_1, previous_clip_position_2, previous_clip_position_3),
|
|
|
|
frag_coord_ndc,
|
|
|
|
view.viewport.zw,
|
|
|
|
);
|
|
|
|
let previous_world_position = mat3x4(previous_world_position_1, previous_world_position_2, previous_world_position_3) * previous_partial_derivatives.barycentrics;
|
|
|
|
let motion_vector = calculate_motion_vector(world_position, previous_world_position);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return VertexOutput(
|
|
|
|
frag_coord,
|
|
|
|
world_position,
|
|
|
|
world_normal,
|
|
|
|
uv,
|
|
|
|
ddx_uv,
|
|
|
|
ddy_uv,
|
|
|
|
world_tangent,
|
|
|
|
instance_uniform.flags,
|
|
|
|
meshlet_id,
|
|
|
|
#ifdef PREPASS_FRAGMENT
|
|
|
|
#ifdef MOTION_VECTOR_PREPASS
|
|
|
|
motion_vector,
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
);
|
|
|
|
}
|
|
|
|
#endif
|