SlideShare a Scribd company logo
The Unity Rendering Pipeline
Kuba Cupisz
(Tim Cooper)
Texthttp://is.gd/RenderingPipeline_UniteAsia13
Who am I?
• Kuba
• graphics programmer
• at Unity for... quite.some.time
• worked on small game projects before
Topics
What Unity is good/bad at
Built-in shaders
Shader combinations
Per material keywords
Lit shader replace
Endless runner with light probes
DX 11
Tessellation
Random writes
Volume textures
What is Unity good at
• Very flexible rendering pipeline
• vertex lit / forward / deferred
• custom shaders
• custom lighting models
• completely customizable
What is Unity bad at
• Very flexible rendering pipeline
• difficult to configure (so.many.options)
• Some parts are better maintained then others
• dual lightmaps in forward
• Default settings do not suit all projects
• very general, scale from mobile to high end
• aim your configuration at your target
Built-in shaders - good for
• Work with all rendering configurations
• forward / deferred, realtime lighting / lightmaps
• Support standard lighting models
• lambert / blinn-phong
• Work on all platforms
Built-in shaders - not good for
• Stylized games
• only provide ‘standard’ lighting models
• Super-performance
• if you know how your game will look, you can write more specific (faster) shaders
• Size
• always have many shader variants due to supporting many possible configurations
When to write your own?
• When the built-in shaders
• are not custom enough
• are not fast enough - don’t assume, profile!
• you know exactly how you want your game to be rendered
Shader combinations
• Compile variants of your shader
• to do different things based on keywords
• shader keywords are set globally
• can be overridden per material
Shader combinations
• Each line declares a set of defines
• only one per line can be active at a time
• Make sure you enable one, otherwise Unity will pick one for you
Shader combinations
#pragma multi_compile AAA BBB
• two variants
• one where AAA is defined
• another where BBB is defined (and AAA is not)
Shader combinations
#pragma multi_compile AAA BBB
#pragma multi_compile CCC
• two variants
• AAA CCC
• BBB CCC
Shader combinations
#pragma multi_compile AAA BBB
#pragma multi_compile CCC DDD
• four variants
• AAA CCC
• BBB CCC
• AAA DDD
• BBB DDD
Per material keywords
• Shader keywords property on a material
• array of strings
• each string a keyword
• Write a custom editor to make it easy to use
Material inspector
• Extend the MaterialEditor class
• Override OnInspectorGUI()
• remember to call base.OnInspectorGUI() !
Shader combinations example
• Surface shader
• 2 defines
• 1 for darken blend mode
• 1 for difference blend mode
• configured via material inspector
Shader combinations
• Applications
• switch the shaders in your scene via a keyword
• completely change the look of your game
• in the future
• one shader for: diffuse, specular, normal maps, etc.
Shader replace
• Objects normally get rendered with whatever material /shader is configured on
them
• Using shader replace you can swap out the shader
• still uses same material (so textures / properties will be the same as in the original
rendering)
• Sub-shader is selected based on tag-matching
Shader replace - Tags
• When setting a replacement shader, you can set the tag
• Camera.SetReplacementShader (Shader s, string tag)
• Camera.RenderWithShader (Shader s, string tag)
Shader replace - Tags
• No tag specified?
• all objects will be rendered with the replacement shader
• uses the first subshader of the replacement shader
Shader replace - Tags
• Tag set?
• the real object’s shader is queried for the tag value
• no matching tag?
• not rendered
• tag found?
• subshader from the replacement shader selected which matches the tag
Tags
• Builtin, e.g. RenderType:
• Opaque
• Transparent
• TransparentCutout
• etc.
• Custom
• whatever you want!
Lit-Shader replacement
• New in Unity 4.1
• Useful for
• scene view enhancement
• special effects
• How does it work?
• just like normal shader replace!
• but you can use shaders that have lighting passes (surface shaders!)
Endless runner with light probes
• The track is assembled from blocks
• Any block can be matched with any other block
• It’s not feasible to bake light probes for all the combinations of block setups
Endless runner with light probes
• Bake light probes for each block separately
• After baking, light probes are tetrahedralized
• When the player moves from one block to the other you want to switch to light
probes for the new block
• set Lightmapping.lightProbes
Smooth transition
• Just switching from one light probe set to another will give a pop
• Solution:
• make sure that start and end light probe positions have the same layout
• when loading the new probes, set the start probes in the new set to the end probes of the
previous set
Smooth transition
• Transition distance
• add another set of light probes relatively closely to the start probes to control the
transition distance
Baked data is not movable
• Loaded light probes will show up at the positions where they were baked
• in our case the blocks’ pivots are at (0,0,0)
• If you’d use player’s position to sample light probes you’d sample outside of the
volume defined by the probes -- not good
Baked data is not movable
• Luckily you can set lightProbeAnchor on the renderer to a transform of choice
• Parent the transform under the player
• Set local offset to -currentBlocksOffset on block change
DX 11
• Gives you more flexibility
• Allows for techniques that were impossible to do on the GPU before and not
feasible on the CPU
Tessellation
• What is tessellation
• subdivision of geometry
• adds more triangles
• by default in the same plane as the original triangle, so doesn’t add more detail yet
Tessellation
• To get more detail, tessellate and:
• displace by sampling a displacement texture, or
• use Phong tessellation
• inflates the geometry and smooths the silhouette
Tessellation with surface shaders
• Use tessellate:FunctionName modifier in the surface shader declaration
• float FunctionName () { return tessAmount; }
• built-in
• UnityDistanceBasedTess
• tessellate more close to the camera
• UnityEdgeLengthBasedTess
• tessellate big triangles more
Random writes
• Unordered Access View
• for RenderTextures or ComputeBuffers
• allows writing at any position within the buffer
Random writes
• RenderTexture
• generally stores colors
• bajilion different formats
• ARGB32, ARGBHalf, ARGBFloat, R(8|Half|Float), etc.
Random writes
• ComputeBuffer (StructuredBuffer in DX11)
• stores structs or simple types
• could be color, of course
• int, float, you name it
Random writes
• Create a ComputeBuffer from script
• provide the count and the stride (size of one element in bytes)
• Initialize the contents using SetData()
• Set the buffer for a material using SetBuffer()
Random writes
• In the shader declare the buffer as
• StructuredBuffer<your_data_type>
• random reads
• RWStructuredBuffer<your_data_type>
• random reads and writes
Random writes example
• Image analysis
• run a shader on the scene render
• analyze each pixel and write to an output buffer at a location of your choice
• you can also atomically increment the value
• InterlockedAdd()
• requires a buffer of ints or uints though
Volume textures
• You know how textures are normally in 2D?!
• Now they are in 3D!
• BOOM
Volume textures
• How does DX 11 come into play?
• you can fill the volume texture from a compute shader really quickly (do it each frame?)
Volume textures example
• Fills in the volume texture based on dispatch thread ID*
• combined thread and thread group index
* Read up on semantics on MSDN
Questions?
• Kuba @kubacupisz
• Tim @stramit
Appendix
Multiple render targets
• In the shader do:
• void frag(v2f i, out float4 Colour0 : COLOR0, out float4 Colour1 : COLOR1) or
• make the pixel shader return a color array or
• make the pixel shader return a struct with COLOR0...COLORn semantics
Multiple render targets
• In the script do: (javascript)
// rt1, rt2, rt3, rt4 are RenderTextures
// create an array of color buffers
var mrt4 : RenderBuffer[] = [ rt1.colorBuffer, rt2.colorBuffer, rt3.colorBuffer, rt4.colorBuffer ];
// set those color buffers and the depth buffer from the first render texture as the current target
Graphics.SetRenderTarget (mrt4, rt1.depthBuffer);
// draw your stuff!
[...]

More Related Content

PDF
Smedberg niklas bringing_aaa_graphics
PPTX
Relic's FX System
PDF
「原神」におけるコンソールプラットフォーム開発
PDF
Gdc 14 bringing unreal engine 4 to open_gl
PDF
【Unite 2018 Tokyo】スクリプタブルレンダーパイプライン入門
PDF
Rendering Tech of Space Marine
PDF
Authoring of procedural rocks in The Blacksmith realtime short
PPTX
Making a game with Molehill: Zombie Tycoon
Smedberg niklas bringing_aaa_graphics
Relic's FX System
「原神」におけるコンソールプラットフォーム開発
Gdc 14 bringing unreal engine 4 to open_gl
【Unite 2018 Tokyo】スクリプタブルレンダーパイプライン入門
Rendering Tech of Space Marine
Authoring of procedural rocks in The Blacksmith realtime short
Making a game with Molehill: Zombie Tycoon

What's hot (18)

PDF
Unite2013-gavilan-pdf
PPTX
Decima Engine: Visibility in Horizon Zero Dawn
PDF
【Unite 2017 Tokyo】インスタンシングを用いた美麗なグラフィックの実現方法
PDF
Design your 3d game engine
PDF
【Unite 2017 Tokyo】Unity5.6での2D新機能解説
PDF
【Unite 2017 Tokyo】スクリプタブル・レンダーパイプラインのカスタマイズと拡張
PDF
Game Engine Architecture
PPT
GDC 2012: Advanced Procedural Rendering in DX11
PDF
Checkerboard Rendering in Dark Souls: Remastered by QLOC
PDF
CEDEC 2018 - Towards Effortless Photorealism Through Real-Time Raytracing
PPTX
Scene Graphs & Component Based Game Engines
PDF
Unreal Engine Basics 06 - Animation, Audio, Visual Effects
PDF
BSidesDelhi 2018: Headshot - Game Hacking on macOS
PPTX
Hair in Tomb Raider
PPTX
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...
PPT
Star Ocean 4 - Flexible Shader Managment and Post-processing
PDF
State-Based Scripting in Uncharted 2: Among Thieves
PDF
Starling Deep Dive
Unite2013-gavilan-pdf
Decima Engine: Visibility in Horizon Zero Dawn
【Unite 2017 Tokyo】インスタンシングを用いた美麗なグラフィックの実現方法
Design your 3d game engine
【Unite 2017 Tokyo】Unity5.6での2D新機能解説
【Unite 2017 Tokyo】スクリプタブル・レンダーパイプラインのカスタマイズと拡張
Game Engine Architecture
GDC 2012: Advanced Procedural Rendering in DX11
Checkerboard Rendering in Dark Souls: Remastered by QLOC
CEDEC 2018 - Towards Effortless Photorealism Through Real-Time Raytracing
Scene Graphs & Component Based Game Engines
Unreal Engine Basics 06 - Animation, Audio, Visual Effects
BSidesDelhi 2018: Headshot - Game Hacking on macOS
Hair in Tomb Raider
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...
Star Ocean 4 - Flexible Shader Managment and Post-processing
State-Based Scripting in Uncharted 2: Among Thieves
Starling Deep Dive
Ad

Similar to [UniteKorea2013] The Unity Rendering Pipeline (20)

PDF
Shaders in Unity
PPT
Gpu presentation
PDF
Shaders - Claudia Doppioslash - Unity With the Best
PDF
Deferred shading
PPTX
Cg shaders with Unity3D
PDF
Shader editor
PDF
Clean architecture for shaders unite2019
PPTX
Shaders & Standard Shader In Unity
PDF
Abalanche - Unity Shader Graph #1: Shader & PBR Materials
PPT
Advanced Lighting Techniques Dan Baker (Meltdown 2005)
PPTX
Real-time lightmap baking
PDF
iOS Visual F/X Using GLSL
PPT
Programmable Piplelines
PDF
Game Programming 12 - Shaders
PPT
Hardware Shaders
PPTX
Penn graphics
PPT
CS 354 GPU Architecture
PDF
Rendering AAA-Quality Characters of Project A1
PPT
CS 354 Texture Mapping
PPTX
4,000 Adams at 90 Frames Per Second | Yi Fei Boon
Shaders in Unity
Gpu presentation
Shaders - Claudia Doppioslash - Unity With the Best
Deferred shading
Cg shaders with Unity3D
Shader editor
Clean architecture for shaders unite2019
Shaders & Standard Shader In Unity
Abalanche - Unity Shader Graph #1: Shader & PBR Materials
Advanced Lighting Techniques Dan Baker (Meltdown 2005)
Real-time lightmap baking
iOS Visual F/X Using GLSL
Programmable Piplelines
Game Programming 12 - Shaders
Hardware Shaders
Penn graphics
CS 354 GPU Architecture
Rendering AAA-Quality Characters of Project A1
CS 354 Texture Mapping
4,000 Adams at 90 Frames Per Second | Yi Fei Boon
Ad

More from William Hugo Yang (7)

PDF
[UniteKorea2013] Protecting your Android content
PDF
[UniteKorea2013] Serialization in Depth
PPTX
[UniteKorea2013] Memory profiling in Unity
PDF
[UniteKorea2013] Unity Hacks
PDF
[UniteKorea2013] Butterfly Effect DX11
PDF
[UniteKorea2013] Art tips and tricks
PDF
[UniteKorea2013] 2D content workflows
[UniteKorea2013] Protecting your Android content
[UniteKorea2013] Serialization in Depth
[UniteKorea2013] Memory profiling in Unity
[UniteKorea2013] Unity Hacks
[UniteKorea2013] Butterfly Effect DX11
[UniteKorea2013] Art tips and tricks
[UniteKorea2013] 2D content workflows

Recently uploaded (20)

PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
A Presentation on Artificial Intelligence
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
cloud_computing_Infrastucture_as_cloud_p
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PPTX
OMC Textile Division Presentation 2021.pptx
PPT
Teaching material agriculture food technology
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Mushroom cultivation and it's methods.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Machine Learning_overview_presentation.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf
Building Integrated photovoltaic BIPV_UPV.pdf
A Presentation on Artificial Intelligence
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Encapsulation_ Review paper, used for researhc scholars
cloud_computing_Infrastucture_as_cloud_p
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
A comparative study of natural language inference in Swahili using monolingua...
Heart disease approach using modified random forest and particle swarm optimi...
OMC Textile Division Presentation 2021.pptx
Teaching material agriculture food technology
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Mushroom cultivation and it's methods.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Reach Out and Touch Someone: Haptics and Empathic Computing
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Machine learning based COVID-19 study performance prediction
Machine Learning_overview_presentation.pptx

[UniteKorea2013] The Unity Rendering Pipeline

  • 1. The Unity Rendering Pipeline Kuba Cupisz (Tim Cooper) Texthttp://is.gd/RenderingPipeline_UniteAsia13
  • 2. Who am I? • Kuba • graphics programmer • at Unity for... quite.some.time • worked on small game projects before
  • 3. Topics What Unity is good/bad at Built-in shaders Shader combinations Per material keywords Lit shader replace Endless runner with light probes DX 11 Tessellation Random writes Volume textures
  • 4. What is Unity good at • Very flexible rendering pipeline • vertex lit / forward / deferred • custom shaders • custom lighting models • completely customizable
  • 5. What is Unity bad at • Very flexible rendering pipeline • difficult to configure (so.many.options) • Some parts are better maintained then others • dual lightmaps in forward • Default settings do not suit all projects • very general, scale from mobile to high end • aim your configuration at your target
  • 6. Built-in shaders - good for • Work with all rendering configurations • forward / deferred, realtime lighting / lightmaps • Support standard lighting models • lambert / blinn-phong • Work on all platforms
  • 7. Built-in shaders - not good for • Stylized games • only provide ‘standard’ lighting models • Super-performance • if you know how your game will look, you can write more specific (faster) shaders • Size • always have many shader variants due to supporting many possible configurations
  • 8. When to write your own? • When the built-in shaders • are not custom enough • are not fast enough - don’t assume, profile! • you know exactly how you want your game to be rendered
  • 9. Shader combinations • Compile variants of your shader • to do different things based on keywords • shader keywords are set globally • can be overridden per material
  • 10. Shader combinations • Each line declares a set of defines • only one per line can be active at a time • Make sure you enable one, otherwise Unity will pick one for you
  • 11. Shader combinations #pragma multi_compile AAA BBB • two variants • one where AAA is defined • another where BBB is defined (and AAA is not)
  • 12. Shader combinations #pragma multi_compile AAA BBB #pragma multi_compile CCC • two variants • AAA CCC • BBB CCC
  • 13. Shader combinations #pragma multi_compile AAA BBB #pragma multi_compile CCC DDD • four variants • AAA CCC • BBB CCC • AAA DDD • BBB DDD
  • 14. Per material keywords • Shader keywords property on a material • array of strings • each string a keyword • Write a custom editor to make it easy to use
  • 15. Material inspector • Extend the MaterialEditor class • Override OnInspectorGUI() • remember to call base.OnInspectorGUI() !
  • 16. Shader combinations example • Surface shader • 2 defines • 1 for darken blend mode • 1 for difference blend mode • configured via material inspector
  • 17. Shader combinations • Applications • switch the shaders in your scene via a keyword • completely change the look of your game • in the future • one shader for: diffuse, specular, normal maps, etc.
  • 18. Shader replace • Objects normally get rendered with whatever material /shader is configured on them • Using shader replace you can swap out the shader • still uses same material (so textures / properties will be the same as in the original rendering) • Sub-shader is selected based on tag-matching
  • 19. Shader replace - Tags • When setting a replacement shader, you can set the tag • Camera.SetReplacementShader (Shader s, string tag) • Camera.RenderWithShader (Shader s, string tag)
  • 20. Shader replace - Tags • No tag specified? • all objects will be rendered with the replacement shader • uses the first subshader of the replacement shader
  • 21. Shader replace - Tags • Tag set? • the real object’s shader is queried for the tag value • no matching tag? • not rendered • tag found? • subshader from the replacement shader selected which matches the tag
  • 22. Tags • Builtin, e.g. RenderType: • Opaque • Transparent • TransparentCutout • etc. • Custom • whatever you want!
  • 23. Lit-Shader replacement • New in Unity 4.1 • Useful for • scene view enhancement • special effects • How does it work? • just like normal shader replace! • but you can use shaders that have lighting passes (surface shaders!)
  • 24. Endless runner with light probes • The track is assembled from blocks • Any block can be matched with any other block • It’s not feasible to bake light probes for all the combinations of block setups
  • 25. Endless runner with light probes • Bake light probes for each block separately • After baking, light probes are tetrahedralized • When the player moves from one block to the other you want to switch to light probes for the new block • set Lightmapping.lightProbes
  • 26. Smooth transition • Just switching from one light probe set to another will give a pop • Solution: • make sure that start and end light probe positions have the same layout • when loading the new probes, set the start probes in the new set to the end probes of the previous set
  • 27. Smooth transition • Transition distance • add another set of light probes relatively closely to the start probes to control the transition distance
  • 28. Baked data is not movable • Loaded light probes will show up at the positions where they were baked • in our case the blocks’ pivots are at (0,0,0) • If you’d use player’s position to sample light probes you’d sample outside of the volume defined by the probes -- not good
  • 29. Baked data is not movable • Luckily you can set lightProbeAnchor on the renderer to a transform of choice • Parent the transform under the player • Set local offset to -currentBlocksOffset on block change
  • 30. DX 11 • Gives you more flexibility • Allows for techniques that were impossible to do on the GPU before and not feasible on the CPU
  • 31. Tessellation • What is tessellation • subdivision of geometry • adds more triangles • by default in the same plane as the original triangle, so doesn’t add more detail yet
  • 32. Tessellation • To get more detail, tessellate and: • displace by sampling a displacement texture, or • use Phong tessellation • inflates the geometry and smooths the silhouette
  • 33. Tessellation with surface shaders • Use tessellate:FunctionName modifier in the surface shader declaration • float FunctionName () { return tessAmount; } • built-in • UnityDistanceBasedTess • tessellate more close to the camera • UnityEdgeLengthBasedTess • tessellate big triangles more
  • 34. Random writes • Unordered Access View • for RenderTextures or ComputeBuffers • allows writing at any position within the buffer
  • 35. Random writes • RenderTexture • generally stores colors • bajilion different formats • ARGB32, ARGBHalf, ARGBFloat, R(8|Half|Float), etc.
  • 36. Random writes • ComputeBuffer (StructuredBuffer in DX11) • stores structs or simple types • could be color, of course • int, float, you name it
  • 37. Random writes • Create a ComputeBuffer from script • provide the count and the stride (size of one element in bytes) • Initialize the contents using SetData() • Set the buffer for a material using SetBuffer()
  • 38. Random writes • In the shader declare the buffer as • StructuredBuffer<your_data_type> • random reads • RWStructuredBuffer<your_data_type> • random reads and writes
  • 39. Random writes example • Image analysis • run a shader on the scene render • analyze each pixel and write to an output buffer at a location of your choice • you can also atomically increment the value • InterlockedAdd() • requires a buffer of ints or uints though
  • 40. Volume textures • You know how textures are normally in 2D?! • Now they are in 3D! • BOOM
  • 41. Volume textures • How does DX 11 come into play? • you can fill the volume texture from a compute shader really quickly (do it each frame?)
  • 42. Volume textures example • Fills in the volume texture based on dispatch thread ID* • combined thread and thread group index * Read up on semantics on MSDN
  • 45. Multiple render targets • In the shader do: • void frag(v2f i, out float4 Colour0 : COLOR0, out float4 Colour1 : COLOR1) or • make the pixel shader return a color array or • make the pixel shader return a struct with COLOR0...COLORn semantics
  • 46. Multiple render targets • In the script do: (javascript) // rt1, rt2, rt3, rt4 are RenderTextures // create an array of color buffers var mrt4 : RenderBuffer[] = [ rt1.colorBuffer, rt2.colorBuffer, rt3.colorBuffer, rt4.colorBuffer ]; // set those color buffers and the depth buffer from the first render texture as the current target Graphics.SetRenderTarget (mrt4, rt1.depthBuffer); // draw your stuff! [...]