Skip to content

Commit 1745321

Browse files
authored
Stencil (#649)
* started writeup * finished write up
1 parent 8d08d4c commit 1745321

7 files changed

Lines changed: 449 additions & 39 deletions

File tree

code/showcase/snow/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ impl framework::Demo for Snow {
266266
})
267267
}
268268

269-
fn handle_mouse_move(&mut self, dx: f64, dy: f64) {
269+
fn handle_mouse_move(&mut self, _dx: f64, _dy: f64) {
270270
// self.camera_controller.process_mouse(dx, dy);
271271
// self.uniforms_dirty = true;
272272
}

code/showcase/stencil/src/main.rs

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::f32;
2-
use std::f32::consts::PI;
2+
use core::f32::consts::PI;
33

4-
use framework::{Demo, DrawModel, MaterialBinder, ModelVertex, Vertex};
4+
use framework::{Demo, MaterialBinder, ModelVertex, Vertex};
55
use glam::{Vec3, Vec4};
66
use rand::Rng;
77
use winit::keyboard::KeyCode;
@@ -23,18 +23,12 @@ impl InstanceVertex {
2323
};
2424
}
2525

26-
fn random_color() -> Vec4 {
27-
let mut rng = rand::thread_rng();
28-
Vec4::new(rng.r#gen(), rng.r#gen(), rng.r#gen(), 1.0)
29-
}
30-
3126
fn random_position_scale(min: Vec3, max: Vec3) -> Vec4 {
3227
let mut rng = rand::thread_rng();
3328
Vec4::new(
3429
rng.gen_range(min.x..=max.x),
3530
rng.gen_range(min.y..=max.y),
3631
rng.gen_range(min.z..=max.z),
37-
// rng.gen_range(0.25..=0.75),
3832
0.5,
3933
)
4034
}
@@ -56,7 +50,7 @@ pub struct Stencil {
5650
mask_bind_group: wgpu::BindGroup,
5751
model: framework::Model,
5852
visible_pipeline: wgpu::RenderPipeline,
59-
invisible_pipeline: wgpu::RenderPipeline,
53+
hidden_pipeline: wgpu::RenderPipeline,
6054
lmb_presssed: bool,
6155
}
6256

@@ -218,11 +212,6 @@ impl Demo for Stencil {
218212
.vertex_shader(mask_shader.clone())
219213
.fragment_shader(mask_shader.clone())
220214
.fragment_entry_point("fs_mask")
221-
.color_state(wgpu::ColorTargetState {
222-
format: display.config.format,
223-
blend: None,
224-
write_mask: wgpu::ColorWrites::empty(),
225-
})
226215
.cull_mode(Some(wgpu::Face::Back))
227216
.depth_stencil(wgpu::DepthStencilState {
228217
format: depth_stencil_format,
@@ -283,7 +272,7 @@ impl Demo for Stencil {
283272
.vertex_buffer_desc(InstanceVertex::DESC)
284273
.build(&display.device)?;
285274

286-
let invisible_pipeline = framework::RenderPipelineBuilder::new()
275+
let hidden_pipeline = framework::RenderPipelineBuilder::new()
287276
.layout(&model_pipeline_layout)
288277
.vertex_shader(model_shader.clone())
289278
.fragment_shader(model_shader.clone())
@@ -329,7 +318,7 @@ impl Demo for Stencil {
329318
mask_bind_group,
330319
model,
331320
visible_pipeline,
332-
invisible_pipeline,
321+
hidden_pipeline,
333322
lmb_presssed,
334323
})
335324
}
@@ -393,28 +382,20 @@ impl Demo for Stencil {
393382
{
394383
let mut draw_mask_stencil = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
395384
label: Some("draw_mask"),
396-
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
397-
view: &view,
398-
resolve_target: None,
399-
ops: wgpu::Operations {
400-
load: wgpu::LoadOp::Load,
401-
store: wgpu::StoreOp::Store,
402-
},
403-
depth_slice: None,
404-
})],
385+
color_attachments: &[],
405386
depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {
406387
view: &self.depth_stencil_view,
407388
depth_ops: None,
408389
stencil_ops: Some(wgpu::Operations {
409-
load: wgpu::LoadOp::Clear(0xFF),
390+
load: wgpu::LoadOp::Clear(0),
410391
store: wgpu::StoreOp::Store,
411392
}),
412393
}),
413394
timestamp_writes: None,
414395
occlusion_query_set: None,
415396
});
416397

417-
draw_mask_stencil.set_stencil_reference(0);
398+
draw_mask_stencil.set_stencil_reference(0xFF);
418399
draw_mask_stencil.set_pipeline(&self.mask_pipeline);
419400
draw_mask_stencil.set_bind_group(0, &self.mask_bind_group, &[]);
420401
draw_mask_stencil.draw(0..3, 0..1);
@@ -462,7 +443,7 @@ impl Demo for Stencil {
462443
}
463444

464445
{
465-
let mut draw_invisible = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
446+
let mut draw_hidden = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
466447
label: Some("draw_invisible"),
467448
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
468449
view: &view,
@@ -488,17 +469,17 @@ impl Demo for Stencil {
488469
timestamp_writes: None,
489470
});
490471

491-
draw_invisible.set_stencil_reference(0xFF);
492-
draw_invisible.set_pipeline(&self.invisible_pipeline);
493-
draw_invisible.set_bind_group(0, &self.camera_bind_group, &[]);
494-
draw_invisible.set_vertex_buffer(1, self.instance_buffer.buffer.slice(..));
472+
draw_hidden.set_stencil_reference(0xFF);
473+
draw_hidden.set_pipeline(&self.hidden_pipeline);
474+
draw_hidden.set_bind_group(0, &self.camera_bind_group, &[]);
475+
draw_hidden.set_vertex_buffer(1, self.instance_buffer.buffer.slice(..));
495476
for mesh in &self.model.meshes {
496477
if let Some(material) = self.model.materials.get(mesh.material) {
497-
draw_invisible.set_bind_group(1, &material.bind_group, &[]);
498-
draw_invisible
478+
draw_hidden.set_bind_group(1, &material.bind_group, &[]);
479+
draw_hidden
499480
.set_index_buffer(mesh.index_buffer.slice(..), wgpu::IndexFormat::Uint32);
500-
draw_invisible.set_vertex_buffer(0, mesh.vertex_buffer.slice(..));
501-
draw_invisible.draw_indexed(
481+
draw_hidden.set_vertex_buffer(0, mesh.vertex_buffer.slice(..));
482+
draw_hidden.draw_indexed(
502483
0..mesh.num_elements,
503484
0,
504485
instance_split..num_instances,

code/showcase/stencil/src/mask.wgsl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,13 @@ fn vs_main(
2323
return out;
2424
}
2525

26+
2627
@fragment
2728
fn fs_mask(in: VertexOutput) {
2829
let sample = textureSample(mask_texture, mask_sampler, in.uv);
29-
if (sample.a < 0.1) {
30+
// We invert this check so that the mask will render objects in
31+
// the center
32+
if (sample.a > 0.1) {
3033
discard;
3134
}
3235
}

docs/.vuepress/config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@ module.exports = {
5959
'/showcase/',
6060
'/showcase/windowless/',
6161
'/showcase/gifs/',
62+
'/showcase/stencil/',
6263
'/showcase/pong/',
63-
'/showcase/compute/',
6464
'/showcase/alignment/',
65+
// '/showcase/compute/',
6566
]
6667
},
6768
{

docs/showcase/stencil/image.png

210 KB
Loading
139 KB
Loading

0 commit comments

Comments
 (0)