Skip to content

Commit f408734

Browse files
committed
replace flat shader uses with specific ones with native shaders
1 parent 09e96e3 commit f408734

File tree

12 files changed

+398
-310
lines changed

12 files changed

+398
-310
lines changed

fyrox-impl/src/renderer/flat_shader.rs

Lines changed: 0 additions & 48 deletions
This file was deleted.

fyrox-impl/src/renderer/light.rs

Lines changed: 51 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,11 @@ use crate::{
3333
},
3434
uniform::{UniformBufferCache, UniformMemoryAllocator},
3535
},
36-
flat_shader::FlatShader,
3736
framework::{
38-
buffer::BufferUsage,
39-
error::FrameworkError,
40-
framebuffer::{BufferLocation, GpuFrameBuffer, ResourceBindGroup, ResourceBinding},
41-
geometry_buffer::GpuGeometryBuffer,
42-
server::GraphicsServer,
43-
uniform::StaticUniformBuffer,
44-
ColorMask, CompareFunc, CullFace, DrawParameters, ElementRange, GeometryBufferExt,
45-
StencilAction, StencilFunc, StencilOp,
37+
buffer::BufferUsage, error::FrameworkError, framebuffer::GpuFrameBuffer,
38+
geometry_buffer::GpuGeometryBuffer, server::GraphicsServer, ColorMask, CompareFunc,
39+
CullFace, DrawParameters, ElementRange, GeometryBufferExt, StencilAction, StencilFunc,
40+
StencilOp,
4641
},
4742
gbuffer::GBuffer,
4843
light_volume::LightVolumeRenderer,
@@ -78,12 +73,13 @@ pub struct DeferredLightRenderer {
7873
sphere: GpuGeometryBuffer,
7974
cone: GpuGeometryBuffer,
8075
skybox: GpuGeometryBuffer,
81-
flat_shader: FlatShader,
8276
skybox_shader: RenderPassContainer,
8377
spot_shadow_map_renderer: SpotShadowMapRenderer,
8478
point_shadow_map_renderer: PointShadowMapRenderer,
8579
csm_renderer: CsmRenderer,
8680
light_volume: LightVolumeRenderer,
81+
volume_marker: RenderPassContainer,
82+
pixel_counter: RenderPassContainer,
8783
}
8884

8985
pub(crate) struct DeferredRendererContext<'a> {
@@ -209,7 +205,6 @@ impl DeferredLightRenderer {
209205
BufferUsage::StaticDraw,
210206
server,
211207
)?,
212-
flat_shader: FlatShader::new(server)?,
213208
skybox_shader: RenderPassContainer::from_str(
214209
server,
215210
include_str!("shaders/skybox.shader"),
@@ -230,6 +225,14 @@ impl DeferredLightRenderer {
230225
quality_defaults.csm_settings.size,
231226
quality_defaults.csm_settings.precision,
232227
)?,
228+
volume_marker: RenderPassContainer::from_str(
229+
server,
230+
include_str!("shaders/volume_marker_lit.shader"),
231+
)?,
232+
pixel_counter: RenderPassContainer::from_str(
233+
server,
234+
include_str!("shaders/pixel_counter.shader"),
235+
)?,
233236
})
234237
}
235238

@@ -505,44 +508,39 @@ impl DeferredLightRenderer {
505508
let mut light_view_projection = Matrix4::identity();
506509

507510
// Mark lit areas in stencil buffer to do light calculations only on them.
508-
let uniform_buffer = uniform_buffer_cache.write(
509-
StaticUniformBuffer::<256>::new().with(&(view_projection * bounding_shape_matrix)),
510-
)?;
511-
511+
let shape_wvp_matrix = view_projection * bounding_shape_matrix;
512512
for (cull_face, stencil_action) in [
513513
(CullFace::Front, StencilAction::Incr),
514514
(CullFace::Back, StencilAction::Decr),
515515
] {
516-
pass_stats += frame_buffer.draw(
516+
let draw_params = DrawParameters {
517+
cull_face: Some(cull_face),
518+
color_write: ColorMask::all(false),
519+
depth_write: false,
520+
stencil_test: Some(StencilFunc {
521+
func: CompareFunc::Always,
522+
..Default::default()
523+
}),
524+
stencil_op: StencilOp {
525+
zfail: stencil_action,
526+
..Default::default()
527+
},
528+
depth_test: Some(CompareFunc::Less),
529+
blend: None,
530+
scissor_box: None,
531+
};
532+
let properties =
533+
PropertyGroup::from([property("worldViewProjection", &shape_wvp_matrix)]);
534+
let material = RenderMaterial::from([binding("properties", &properties)]);
535+
pass_stats += self.volume_marker.run_pass(
536+
&ImmutableString::new("Primary"),
537+
frame_buffer,
517538
bounding_shape,
518539
viewport,
519-
&self.flat_shader.program,
520-
&DrawParameters {
521-
cull_face: Some(cull_face),
522-
color_write: ColorMask::all(false),
523-
depth_write: false,
524-
stencil_test: Some(StencilFunc {
525-
func: CompareFunc::Always,
526-
..Default::default()
527-
}),
528-
stencil_op: StencilOp {
529-
zfail: stencil_action,
530-
..Default::default()
531-
},
532-
depth_test: Some(CompareFunc::Less),
533-
blend: None,
534-
scissor_box: None,
535-
},
536-
&[ResourceBindGroup {
537-
bindings: &[ResourceBinding::Buffer {
538-
buffer: uniform_buffer.clone(),
539-
binding: BufferLocation::Auto {
540-
shader_location: self.flat_shader.uniform_buffer_binding,
541-
},
542-
data_usage: Default::default(),
543-
}],
544-
}],
545-
ElementRange::Full,
540+
&material,
541+
uniform_buffer_cache,
542+
Default::default(),
543+
Some(&draw_params),
546544
)?;
547545
}
548546

@@ -557,37 +555,19 @@ impl DeferredLightRenderer {
557555
if visibility_cache.needs_occlusion_query(camera_global_position, light.handle) {
558556
// Draw full screen quad, that will be used to count pixels that passed the stencil test
559557
// on the stencil buffer's content generated by two previous drawing commands.
560-
let uniform_buffer = uniform_buffer_cache
561-
.write(StaticUniformBuffer::<256>::new().with(&frame_matrix))?;
562-
563558
visibility_cache.begin_query(server, camera_global_position, light.handle)?;
564-
pass_stats += frame_buffer.draw(
559+
let properties =
560+
PropertyGroup::from([property("worldViewProjection", &frame_matrix)]);
561+
let material = RenderMaterial::from([binding("properties", &properties)]);
562+
pass_stats += self.pixel_counter.run_pass(
563+
&ImmutableString::new("Primary"),
564+
frame_buffer,
565565
&self.quad,
566566
viewport,
567-
&self.flat_shader.program,
568-
&DrawParameters {
569-
cull_face: None,
570-
color_write: ColorMask::all(false),
571-
depth_write: false,
572-
stencil_test: Some(StencilFunc {
573-
func: CompareFunc::NotEqual,
574-
..Default::default()
575-
}),
576-
depth_test: None,
577-
blend: None,
578-
stencil_op: Default::default(),
579-
scissor_box: None,
580-
},
581-
&[ResourceBindGroup {
582-
bindings: &[ResourceBinding::Buffer {
583-
buffer: uniform_buffer,
584-
binding: BufferLocation::Auto {
585-
shader_location: self.flat_shader.uniform_buffer_binding,
586-
},
587-
data_usage: Default::default(),
588-
}],
589-
}],
590-
ElementRange::Full,
567+
&material,
568+
uniform_buffer_cache,
569+
Default::default(),
570+
None,
591571
)?;
592572
visibility_cache.end_query();
593573
}

fyrox-impl/src/renderer/light_volume.rs

Lines changed: 25 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,9 @@ use crate::{
3030
shader::{binding, property, PropertyGroup, RenderMaterial, RenderPassContainer},
3131
uniform::UniformBufferCache,
3232
},
33-
flat_shader::FlatShader,
3433
framework::{
35-
buffer::BufferUsage,
36-
error::FrameworkError,
37-
framebuffer::{BufferLocation, GpuFrameBuffer, ResourceBindGroup, ResourceBinding},
38-
geometry_buffer::GpuGeometryBuffer,
39-
server::GraphicsServer,
40-
uniform::StaticUniformBuffer,
41-
ColorMask, CompareFunc, DrawParameters, ElementRange, GeometryBufferExt, StencilAction,
42-
StencilFunc, StencilOp,
34+
buffer::BufferUsage, error::FrameworkError, framebuffer::GpuFrameBuffer,
35+
geometry_buffer::GpuGeometryBuffer, server::GraphicsServer, GeometryBufferExt,
4336
},
4437
gbuffer::GBuffer,
4538
make_viewport_matrix, RenderPassStatistics,
@@ -50,9 +43,9 @@ use crate::{
5043
pub struct LightVolumeRenderer {
5144
spot_light_shader: RenderPassContainer,
5245
point_light_shader: RenderPassContainer,
53-
flat_shader: FlatShader,
5446
cone: GpuGeometryBuffer,
5547
sphere: GpuGeometryBuffer,
48+
volume_marker: RenderPassContainer,
5649
}
5750

5851
impl LightVolumeRenderer {
@@ -66,7 +59,6 @@ impl LightVolumeRenderer {
6659
server,
6760
include_str!("shaders/point_volumetric.shader"),
6861
)?,
69-
flat_shader: FlatShader::new(server)?,
7062
cone: GpuGeometryBuffer::from_surface_data(
7163
&SurfaceData::make_cone(
7264
16,
@@ -82,6 +74,10 @@ impl LightVolumeRenderer {
8274
BufferUsage::StaticDraw,
8375
server,
8476
)?,
77+
volume_marker: RenderPassContainer::from_str(
78+
server,
79+
include_str!("shaders/volume_marker_vol.shader"),
80+
)?,
8581
})
8682
}
8783

@@ -121,7 +117,6 @@ impl LightVolumeRenderer {
121117
// Draw cone into stencil buffer - it will mark pixels for further volumetric light
122118
// calculations, it will significantly reduce amount of pixels for far lights thus
123119
// significantly improve performance.
124-
125120
let k = (full_cone_angle * 0.5 + 1.0f32.to_radians()).tan() * distance;
126121
let light_shape_matrix = Isometry3 {
127122
rotation: graph.global_rotation(light.handle),
@@ -136,40 +131,17 @@ impl LightVolumeRenderer {
136131
// Clear stencil only.
137132
frame_buffer.clear(viewport, None, None, Some(0));
138133

139-
stats += frame_buffer.draw(
134+
let properties = PropertyGroup::from([property("worldViewProjection", &mvp)]);
135+
let material = RenderMaterial::from([binding("properties", &properties)]);
136+
stats += self.volume_marker.run_pass(
137+
&ImmutableString::new("Primary"),
138+
frame_buffer,
140139
&self.cone,
141140
viewport,
142-
&self.flat_shader.program,
143-
&DrawParameters {
144-
cull_face: None,
145-
color_write: ColorMask::all(false),
146-
depth_write: false,
147-
stencil_test: Some(StencilFunc {
148-
func: CompareFunc::Equal,
149-
ref_value: 0xFF,
150-
mask: 0xFFFF_FFFF,
151-
}),
152-
depth_test: Some(CompareFunc::Less),
153-
blend: None,
154-
stencil_op: StencilOp {
155-
fail: StencilAction::Replace,
156-
zfail: StencilAction::Keep,
157-
zpass: StencilAction::Replace,
158-
write_mask: 0xFFFF_FFFF,
159-
},
160-
scissor_box: None,
161-
},
162-
&[ResourceBindGroup {
163-
bindings: &[ResourceBinding::Buffer {
164-
buffer: uniform_buffer_cache
165-
.write(StaticUniformBuffer::<256>::new().with(&mvp))?,
166-
binding: BufferLocation::Auto {
167-
shader_location: self.flat_shader.uniform_buffer_binding,
168-
},
169-
data_usage: Default::default(),
170-
}],
171-
}],
172-
ElementRange::Full,
141+
&material,
142+
uniform_buffer_cache,
143+
Default::default(),
144+
None,
173145
)?;
174146

175147
// Finally draw fullscreen quad, GPU will calculate scattering only on pixels that were
@@ -214,42 +186,17 @@ impl LightVolumeRenderer {
214186
* Matrix4::new_nonuniform_scaling(&Vector3::new(k, k, k));
215187
let mvp = view_proj * light_shape_matrix;
216188

217-
let uniform_buffer =
218-
uniform_buffer_cache.write(StaticUniformBuffer::<256>::new().with(&mvp))?;
219-
220-
stats += frame_buffer.draw(
189+
let properties = PropertyGroup::from([property("worldViewProjection", &mvp)]);
190+
let material = RenderMaterial::from([binding("properties", &properties)]);
191+
stats += self.volume_marker.run_pass(
192+
&ImmutableString::new("Primary"),
193+
frame_buffer,
221194
&self.sphere,
222195
viewport,
223-
&self.flat_shader.program,
224-
&DrawParameters {
225-
cull_face: None,
226-
color_write: ColorMask::all(false),
227-
depth_write: false,
228-
stencil_test: Some(StencilFunc {
229-
func: CompareFunc::Equal,
230-
ref_value: 0xFF,
231-
mask: 0xFFFF_FFFF,
232-
}),
233-
depth_test: Some(CompareFunc::Less),
234-
blend: None,
235-
stencil_op: StencilOp {
236-
fail: StencilAction::Replace,
237-
zfail: StencilAction::Keep,
238-
zpass: StencilAction::Replace,
239-
write_mask: 0xFFFF_FFFF,
240-
},
241-
scissor_box: None,
242-
},
243-
&[ResourceBindGroup {
244-
bindings: &[ResourceBinding::Buffer {
245-
buffer: uniform_buffer,
246-
binding: BufferLocation::Auto {
247-
shader_location: self.flat_shader.uniform_buffer_binding,
248-
},
249-
data_usage: Default::default(),
250-
}],
251-
}],
252-
ElementRange::Full,
196+
&material,
197+
uniform_buffer_cache,
198+
Default::default(),
199+
None,
253200
)?;
254201

255202
// Finally draw fullscreen quad, GPU will calculate scattering only on pixels that were

0 commit comments

Comments
 (0)