WetBrush: GPU-based 3D Painting Simulation at the Bristle Level - - PowerPoint PPT Presentation

β–Ά
wetbrush gpu based 3d painting simulation at the bristle
SMART_READER_LITE
LIVE PREVIEW

WetBrush: GPU-based 3D Painting Simulation at the Bristle Level - - PowerPoint PPT Presentation

WetBrush: GPU-based 3D Painting Simulation at the Bristle Level Zhili Chen Byungmoon Kim Adobe Research GTC 2016 Oil painting with brush Complex interactions Bristle-Bristle Bristle-Paint Paint-Paint Motivation:


slide-1
SLIDE 1

GTC 2016

WetBrush: GPU-based 3D Painting Simulation at the Bristle Level

Zhili Chen Byungmoon Kim Adobe Research

slide-2
SLIDE 2

GTC 2016

2

Oil painting with brush

  • Complex interactions
  • Bristle-Bristle
  • Bristle-Paint
  • Paint-Paint
  • Motivation:
  • Exhaustive simulation?
slide-3
SLIDE 3

GTC 2016

3

Oil Painting Simulation

Brush Sim Renderer User Input

Brush head movement Two-way Bristle-Paint Liquid Interaction

Paint Liquid

slide-4
SLIDE 4

GTC 2016

4

Brush Model

  • Previous works on brush model

2D Stamps 2D Surface wrapped around skeleton Individual bristles

Chu et al., 2002 Expresii DiVerdi et al., 2010 D-Brush in Photoshop Natural brushes in Photoshop

  • No variations from

brush dynamics

  • No details from individual

bristles with large deformation

  • Brush shape not realistic without

inter-bristle interactions

slide-5
SLIDE 5

GTC 2016

5

Brush Model

  • Our model

Bristle vertices Bristle samples

50-100 bristles ~10 vertices per bristle

πͺ𝑗 πͺ𝑗+1 π‘š0 πͺ𝑗 πͺ𝑗+1 πͺπ‘—βˆ’1 πœ„

Bending Stretching

slide-6
SLIDE 6

GTC 2016

6

Brush Model

  • Inter-bristle interactions
  • Collision
  • Friction
slide-7
SLIDE 7

GTC 2016

7

Paint Liquid Model

Height field Volumetric grid Particles

Chu, et al. 2010 Microsoft FreshPaint

Overhang Multi-layer color mixing

?

  • Track volume and mass better
  • Less blurring from grid-sampling
  • Model paint carried by brush
slide-8
SLIDE 8

GTC 2016

8

Hybrid Fluid Representation

Brush

Fluid particles

  • Adaptive Hybrid Fluid Representation based on
  • Distance to brush
  • Velocity
slide-9
SLIDE 9

GTC 2016

9

Hybrid Fluid Representation

Brush

Fluid particles

Particles

  • Adaptive Hybrid Fluid Representation based on
  • Distance to brush
  • Velocity
  • Close to the brush
  • OR Fast Moving
  • Cover smaller region
slide-10
SLIDE 10

GTC 2016

10

Hybrid Fluid Representation

Brush

Fluid particles

Particles Density Grid

  • Adaptive Hybrid Fluid Representation based on
  • Distance to brush
  • Velocity
  • Close to the brush
  • OR Fast Moving
  • Cover smaller region
  • Further away from the brush
  • AND Slow moving
  • Cover larger region
slide-11
SLIDE 11

GTC 2016

11

Fluid Conversions

Grid & Particles Visualized Only Particles Visualized

  • FLIP
  • Particles sample from velocity grid
  • Avoid expensive neighbor searching

Grid Fluid Particle Fluid

  • Sample new

particles

  • Convert and delete

stationary particles

slide-12
SLIDE 12

GTC 2016

12

Hybrid Fluid

Grid Only Grid+Particle

  • Less volume loss
  • Better surface tracking
  • Sharper surface detail
  • Sharper color mixing
slide-13
SLIDE 13

GTC 2016

13

Brush-Paint Interaction

Brush Sim Grid Fluid Particle Fluid

  • Brush emit new pigment particles
  • Brush carries and pushes existing fluid particles
  • Brush pick up color from paint on canvas
  • Thick paint affect brush motion and shape
slide-14
SLIDE 14

GTC 2016

14

Implementation

  • CUDA implementation
  • Both brush and paint liquid in CUDA
  • CUDA+OpenGL interop. for rendering
  • Rendering
  • Ray casting on paint density grid and pigment grid
  • Screen space particle rendering
slide-15
SLIDE 15

GTC 2016

15

Implementation

k_ForwardPosition Hash SolveSelfCollision k_ProjectConstraints k_UpdateFinalSim k_UpdateRendering k_UpdateSorted FindBrushBoundingB

  • x

k_InterpolatePaintNo des k_UpdatePaintNodesRendering k_VoxelizeBrush k_FilterBrushVoxelization k_BrushDistanceMap k_Advection_Particles k_RasterizeParticleTrilinear k_NormalizeRasterization k_MixBrushVelocity Diffusion PostProcessVelocity k_AdvectPaintDensityGrid SpawnNewPaticles k_BrushPickupPigment k_BrushPaintNodesDistanceToPaintSurface k_PaintNodeEmitNewParticlesBasedOnDistanceToPaint k_PIC k_FindConvertParticlesToPaintDensity k_ExtendPigment SaveActiveDomain

Forward Brush Inter-Bristle Collision Bristle Stretching and Bending Update Brush Attributes for Rendering Update Brush Paint Nodes that holds pigment Voxelize Brush Create Brush Distance Field Find Brush Bounding Box Forward FLIP Particles Rasterize Particles

  • nto Velocity

Grid Diffusion and Dissapation Mix with Brush Velocity Field Grid Fluid Simulation Brush Pickup Pigment Sample New Particles from Density Grid Brush Vertices emit new Paint Particles Resample FLIP Particle Velocities Convert inactive particles to density grid Save current window back to full- canvas texture

slide-16
SLIDE 16

GTC 2016

16

Performance GTX Titan X

  • Benchmark sequence: 46 fps, 92K Particles (~2M at maximum)

5% 30% 24% 24% 8% 9% Grid-based liquid simulation

(6.5ms)

Particle-based liquid simulation

(5.2ms)

Grid-particle transfer

(5.2ms)

Brush simulation

(1.1ms)

Rendering

(2.0ms)

Bristle-particle transfer

(1.6ms)

slide-17
SLIDE 17

GTC 2016

17

Performance

  • Faster stroke requires higher framerate
  • Faster stroke => more stroke samples per unit time
  • Maximum distance between stroke sample ~= 3-5 pixels

Stroke Sample distance 2px Stroke Sample distance 30px

slide-18
SLIDE 18

GTC 2016

18

Optimization

slide-19
SLIDE 19

GTC 2016

19

Optimization

  • Adaptive simulation window (vs fixed simulation window)

Axis-aligned bounding box for brush Active simulation window thrust::minmax_element() For grid fluid simulation

46 fps-> 75 fps (63%)

slide-20
SLIDE 20

GTC 2016

20

Optimization

  • Particle insertion

Num_Particles Particle Array AtomicInc(Num_Particles)

slide-21
SLIDE 21

GTC 2016

21

Optimization

New Particle Array

  • Pre-allocate maximum #

particle space for each cell

  • No more than 27 particles within one grid cell
  • No more than one particle in one subcell

Marker Array

  • 1 => a new particle is

added for the element Cell 𝑗 Cell 𝑗 + 1

  • Optimized Particle insertion

Cell 𝑗 βˆ’ 1

1 1 1 1 1 1

slide-22
SLIDE 22

GTC 2016

22

Optimization

New Particle Array

  • Pre-allocate maximum #

particle space for each cell

Marker Array

  • 1 => a new particle is

added for the element Cell 𝑗 Cell 𝑗 + 1

  • Optimized Particle insertion

Cell 𝑗 βˆ’ 1

1 1 1 1 1 1

Compact New Particle Array thrust::remove_if() Shrink List Append Particle Array

75 fps-> 92 fps (22%)

slide-23
SLIDE 23

GTC 2016

23

Kernel Pipeline

k_ForwardPosition Hash SolveSelfCollision k_ProjectConstraints k_UpdateFinalSim k_UpdateRendering k_UpdateSorted FindBrushBoundingB

  • x

k_InterpolatePaintNo des k_UpdatePaintNodesRendering k_VoxelizeBrush k_FilterBrushVoxelization k_BrushDistanceMap k_Advection_Particles k_RasterizeParticleTrilinear k_NormalizeRasterization k_MixBrushVelocity Diffusion PostProcessVelocity k_AdvectPaintDensityGrid SpawnNewPaticles k_BrushPickupPigment k_BrushPaintNodesDistanceToPaintSurface k_PaintNodeEmitNewParticlesBasedOnDistanceToPaint k_PIC k_FindConvertParticlesToPaintDensity k_ExtendPigment SaveActiveDomain

slide-24
SLIDE 24

GTC 2016

24

Kernel Pipeline

k_ForwardPosition Hash SolveSelfCollision k_ProjectConstraints k_UpdateFinalSim k_UpdateRendering k_UpdateSorted FindBrushBoundingB

  • x

k_InterpolatePaintNo des k_UpdatePaintNodesRendering k_VoxelizeBrush k_FilterBrushVoxelization k_BrushDistanceMap k_Advection_Particles k_RasterizeParticleTrilinear k_NormalizeRasterization k_MixBrushVelocity Diffusion PostProcessVelocity k_AdvectPaintDensityGrid SpawnNewPaticles k_BrushPickupPigment k_BrushPaintNodesDistanceToPaintSurface k_PaintNodeEmitNewParticlesBasedOnDistanceToPaint k_PIC k_FindConvertParticlesToPaintDensity k_ExtendPigment SaveActiveDomain

Low occupancy, GPU almost idle

slide-25
SLIDE 25

GTC 2016

25

Dependencies

k_ForwardPosition Hash SolveSelfCollision k_ProjectConstraints k_UpdateFinalSim k_UpdateRendering k_UpdateSorted FindBrushBoundingB

  • x

k_InterpolatePaintNo des k_UpdatePaintNodesRendering k_VoxelizeBrush k_FilterBrushVoxelization k_Advection_Particles k_RasterizeParticleTrilinear k_NormalizeRasterization k_MixBrushVelocity Diffusion PostProcessVelocity k_PaintNodeEmitNewParticlesBasedOnDistanceToPaint k_PIC k_FindConvertParticlesToPaintDensity k_ExtendPigment SaveActiveDomain k_BrushDistanceMap k_AdvectPaintDensityGrid SpawnNewPaticles k_BrushPickupPigment k_BrushPaintNodesDistanceToPaintSurface

slide-26
SLIDE 26

GTC 2016

26

Dependencies

k_ForwardPosition Hash SolveSelfCollision k_ProjectConstraints k_UpdateFinalSim k_UpdateRendering k_UpdateSorted FindBrushBoundingB

  • x

k_InterpolatePaintNo des k_UpdatePaintNodesRendering k_VoxelizeBrush k_FilterBrushVoxelization k_BrushDistanceMap k_Advection_Particles k_RasterizeParticleTrilinear k_NormalizeRasterization k_MixBrushVelocity Diffusion PostProcessVelocity k_PaintNodeEmitNewParticlesBasedOnDistanceToPaint k_PIC k_FindConvertParticlesToPaintDensity k_ExtendPigment SaveActiveDomain

  • Brush # Vertices << Grid Dimension, Particle #
  • Low occupancy
  • First half of fluid simulation do not depend on brush

k_BrushDistanceMap k_AdvectPaintDensityGrid SpawnNewPaticles k_BrushPickupPigment k_BrushPaintNodesDistanceToPaintSurface

slide-27
SLIDE 27

GTC 2016

27

Dependencies

k_ForwardPosition Hash SolveSelfCollision k_ProjectConstraints k_UpdateFinalSim k_UpdateRendering k_UpdateSorted FindBrushBoundingB

  • x

k_InterpolatePaintNo des k_UpdatePaintNodesRendering k_VoxelizeBrush k_FilterBrushVoxelization k_BrushDistanceMap k_Advection_Particles k_RasterizeParticleTrilinear k_NormalizeRasterization k_MixBrushVelocity Diffusion PostProcessVelocity k_AdvectPaintDensityGrid SpawnNewPaticles k_BrushPaintNodesDistanceToPaintSurface k_PaintNodeEmitNewParticlesBasedOnDistanceToPaint k_PIC k_FindConvertParticlesToPaintDensity k_ExtendPigment SaveActiveDomain

  • Only for rendering
  • Can take place anytime

in a frame

k_BrushPickupPigment

slide-28
SLIDE 28

GTC 2016

28

Dependencies

k_ForwardPosition Hash SolveSelfCollision k_ProjectConstraints k_UpdateFinalSim k_UpdateRendering k_UpdateSorted FindBrushBoundingB

  • x

k_InterpolatePaintNo des k_UpdatePaintNodesRendering k_VoxelizeBrush k_FilterBrushVoxelization k_BrushDistanceMap k_Advection_Particles k_RasterizeParticleTrilinear k_NormalizeRasterization k_MixBrushVelocity Diffusion PostProcessVelocity k_AdvectPaintDensityGrid SpawnNewPaticles k_BrushPickupPigment k_BrushPaintNodesDistanceToPaintSurface k_PaintNodeEmitNewParticlesBasedOnDistanceToPaint k_PIC k_FindConvertParticlesToPaintDensity k_ExtendPigment SaveActiveDomain

  • More parallelization
slide-29
SLIDE 29

GTC 2016

29

Optimization

k_ForwardPosi tion Hash SolveSelfCollision k_ProjectCo nstraints k_UpdateFinalSim k_UpdateRendering k_UpdateSorted k_InterpolatePaintNo des k_UpdatePaintNodesRendering k_VoxelizeBrush k_FilterBrushVoxelization k_BrushDistanceMap k_Advection_Particles k_RasterizeParticleTrilinear k_NormalizeRasterization k_MixBrushVelocity k_AdvectPaintDensityGrid SpawnNewPaticles k_BrushPickupPigment k_BrushPaintNodesDista nceToPaintSurface k_PaintNodeEmitNewParticle sBasedOnDistanceToPaint k_PIC k_FindConvertParticle sToPaintDensity k_ExtendPigment SaveActiveDomain

1 2 3 4

Sync 0->1,3,4 Sync 0->3 Sync 0->2 Sync 2->0

cudaEventRecord() cudaStreamWaitEvent()

FindBrushBoundingB

  • x

PostProcessVelocity Diffusion

  • Using CUDA Streams

92 fps-> 117 fps (27%)

slide-30
SLIDE 30

GTC 2016

30

Optimization

  • 46 fps -> 117 fps (154%)
  • Shared memory, Loop unrolling, Adjusting block size
  • 100~200fps on GTX Titan X
  • 30~50 fps on Surface Book
slide-31
SLIDE 31

GTC 2016

31

Results

slide-32
SLIDE 32

GTC 2016

32

Results

Better 3D shape Finer surface details More pigment variations along strokes

slide-33
SLIDE 33

Thick β€œImpasto” Style A lot of overhang

slide-34
SLIDE 34

Thinner painting style

slide-35
SLIDE 35

Thank you!