SlideShare a Scribd company logo
OpenGL 4.4
Scene Rendering Techniques
Christoph Kubisch - ckubisch@nvidia.com
Markus Tavenrath - matavenrath@nvidia.com
2
 Scene complexity increases
– Deep hierarchies, traversal expensive
– Large objects split up into a lot of little
pieces, increased draw call count
– Unsorted rendering, lot of state changes
 CPU becomes bottleneck when
rendering those scenes
 Removing SceneGraph traversal:
– http://on-demand.gputechconf.com/gtc/2013/presentations/S3032-Advanced-
Scenegraph-Rendering-Pipeline.pdf
Scene Rendering
models courtesy of PTC
3
 Harder to render „Graphicscard“ efficiently than „Racecar“
Challenge not necessarily obvious
 650 000 Triangles
 68 000 Parts
 ~ 10 Triangles per part
 3 700 000 Triangles
 98 000 Parts
 ~ 37 Triangles per part
CPU
App/GL
GPU
GPU
idle
4
 Avoid data redundancy
– Data stored once, referenced multiple times
– Update only once (less host to gpu transfers)
 Increase GPU workload per job (batching)
– Further cuts API calls
– Less driver CPU work
 Minimize CPU/GPU interaction
– Allow GPU to update its own data
– Low API usage when scene is changed little
– E.g. GPU-based culling
Enabling GPU Scalability
5
 Avoids classic
SceneGraph design
 Geometry
– Vertex & Index-Buffer (VBO & IBO)
– Parts (CAD features)
 Material
 Matrix Hierarchy
 Object
References Geometry,
Matrix, Materials
Rendering Research Framework
Same geometry
multiple objects
Same geometry
(fan) multiple parts
6
 Benchmark System
– Core i7 860 2.8Ghz
– Kepler Quadro K5000
– Driver upcoming this summer
 Showing evolution of techniques
– Render time basic technique 32ms (31fps), CPU limited
– Render time best technique 1.3ms (769fps)
– Total speedup of 24.6x
Performance baseline
110 geometries, 66 materials
2500 objects
7
foreach (obj in scene) {
setMatrix (obj.matrix);
// iterate over different materials used
foreach (part in obj.geometry.parts) {
setupGeometryBuffer (part.geometry); // sets vertex and index buffer
setMaterial_if_changed (part.material);
drawPart (part);
}
}
Basic technique 1: 32ms CPU-bound
 Classic uniforms for parameters
 VBO bind per part, drawcall per part, 68k binds/frame
8
Basic technique 2: 17 ms CPU-bound
 Classic uniforms for parameters
 VBO bind per geometry, drawcall per part, 2.5k binds/frame
foreach (obj in scene) {
setupGeometryBuffer (obj.geometry); // sets vertex and index buffer
setMatrix (obj.matrix);
// iterate over parts
foreach (part in obj.geometry.parts) {
setMaterial_if_changed (part.material);
drawPart (part);
}
}
9
 Combine parts with same state
– Object‘s part cache must be rebuilt
based on material/enabled state
Drawcall Grouping
a b c d e f
a b+c fd e
Parts with different materials in geometry
Grouped and „grown“ drawcallsforeach (obj in scene) {
// sets vertex and index buffer
setupGeometryBuffer (obj.geometry);
setMatrix (obj.matrix);
// iterate over material batches: 6.8 ms  -> 2.5x
foreach (batch in obj.materialCache) {
setMaterial (batch.material);
drawBatch (batch.data);
}
}
10
drawBatch (batch) { // 6.8 ms
foreach range in batch.ranges {
glDrawElements (GL_.., range.count, .., range.offset);
}
}
drawBatch (batch) { // 6.1 ms  -> 1.1x
glMultiDrawElements (GL_.., batch.counts[], .., batch.offsets[],
batch.numRanges);
}
 glMultiDrawElements supports
multiple index buffer ranges
glMultiDrawElements (GL 1.4)
a b c d e f
a b+c fd e
offsets[] and counts[] per batch
for glMultiDrawElements
Index Buffer Object
11
foreach (obj in scene) {
setupGeometryBuffer (obj.geometry);
setMatrix (obj.matrix);
// iterate over different materials used
foreach (batch in obj.materialCache) {
setMaterial (batch.material);
drawBatch (batch.geometry);
}
}
Vertex Setup
12
Vertex Format Description
Type Offset StrideIndex
0
1
2
float3
float3
float2
0
12
0
24
8
Stream
0
1
Name
position
normal
texcoord
Buffer=StreamAttribute
13
 One call required for each attribute and stream
 Format is being passed when updating ‚streams‘
 Each attribute could be considered as one stream
Vertex Setup VBO (GL 2.1)
void setupVertexBuffer (obj) {
glBindBuffer (GL_ARRAY_BUFFER, obj.positionNormal);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 24, 0); // pos
glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 24, 12); // normal
glBindBuffer (GL_ARRAY_BUFFER, obj.texcoord);
glVertexAttribPointer (2, 2, GL_FLOAT, GL_FALSE, 8, 0); // texcoord
}
14
Vertex Setup VAB (GL 4.3)
void setupVertexBuffer(obj) {
if formatChanged(obj) {
glVertexAttribFormat (0, 3, GL_FLOAT, false, 0); // position
glVertexAttribFormat (1, 3, GL_FLOAT, false, 12); // normal
glVertexAttribFormat (2, 2, GL_FLOAT, false, 0); // texcoord
glVertexAttribBinding (0, 0); // position -> stream 0
glVertexAttribBinding (1, 0); // normal -> stream 0
glVertexAttribBinding (2, 1); // texcoord -> stream 1
}
// stream, buffer, offset, stride
glBindVertexBuffer (0 , obj.positionNormal, 0 , 24 );
glBindVertexBuffer (1 , obj.texcoord , 0 , 8 );
}
 ARB_vertex_attrib_binding separates format and stream
15
Vertex Setup VBUM
 NV_vertex_buffer_unified_memory uses buffer addresses
glEnableClientState (GL_VERTEX_ATTRIB_UNIFIED_NV); // enable once
void setupVertexBuffer(obj) {
if formatChanged(obj) {
glVertexAttribFormat (0, 3, . . .
// stream, buffer, offset, stride
glBindVertexBuffer (0, 0, 0, 24); // dummy binds
glBindVertexBuffer (1, 0, 0, 8); // to update stride
}
// no binds, but 64-bit gpu addresses stream
glBufferAddressRangeNV (GL_VERTEX_ARRAY_ADDRESS_NV, 0, addr0, length0);
glBufferAddressRangeNV (GL_VERTEX_ARRAY_ADDRESS_NV, 1, addr1, length1);
}
16
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
VBO VAB VAB+VBUM
CPU speedup
High binding frequency
– Framework uses only one stream and three attributes
– VAB benefit depends on vertex buffer bind frequency
Vertex Setup
17
foreach (obj in scene) {
setupGeometryBuffer (obj.geometry);
setMatrix (obj.matrix); // once per object
// iterate over different materials used
foreach (batch in obj.materialCaches) {
setMaterial (batch.material); // once per batch
drawBatch (batch.geometry);
}
}
Parameter Setup
18
 Group parameters by frequency of change
 Generate GLSL shader parameters
Parameter Setup
Effect "Phong" {
Group "material" {
vec4 "ambient"
vec4 "diffuse"
vec4 "specular"
}
Group "object" {
mat4 "world"
mat4 "worldIT"
}
Group "view" {
vec4 "viewProjTM"
}
... Code ...
}
 OpenGL 2 uniforms
 OpenGL 3.x, 4.x buffers
19
 glUniform (2.x)
– one glUniform per parameter
(simple)
– one glUniform array call for all
parameters (ugly)
Uniform
// matrices
uniform mat4 matrix_world;
uniform mat4 matrix_worldIT;
// material
uniform vec4 material_diffuse;
uniform vec4 material_emissive;
...
// material fast but „ugly“
uniform vec4 material_data[8];
#define material_diffuse material_data[0]
...
20
foreach (obj in scene) {
...
glUniform (matrixLoc, obj.matrix);
glUniform (matrixITLoc, obj.matrixIT);
// iterate over different materials used
foreach ( batch in obj.materialCaches) {
glUniform (frontDiffuseLoc, batch.material.frontDiffuse);
glUniform (frontAmbientLoc, batch.material.frontAmbient);
glUniform (...)
...
glMultiDrawElements (...);
}
}
Uniform
21
glBindBufferBase (GL_UNIFORM_BUFFER, 0, uboMatrix);
glBindBufferBase (GL_UNIFORM_BUFFER, 1, uboMaterial);
foreach (obj in scene) {
...
glNamedBufferSubDataEXT (uboMatrix, 0, maSize, obj.matrix);
// iterate over different materials used
foreach ( batch in obj.materialCaches) {
glNamedBufferSubDataEXT (uboMaterial, 1, mtlSize, batch.material);
glMultiDrawElements (...);
}
}
BufferSubData
22
 Changes to existing shaders are minimal
– Surround block of parameters with uniform block
– Actual shader code remains unchanged
 Group parameters by frequency
Uniform to UBO transition
layout(std140,binding=0) uniform matrixBuffer {
mat4 matrix_world;
mat4 matrix_worldIT;
};
layout(std140,binding=1) uniform materialBuffer {
vec4 material_diffuse;
vec4 material_emissive;
...
};
// matrices
uniform mat4 matrix_world;
uniform mat4 matrix_worldIT;
// material
uniform vec4 material_diffuse;
uniform vec4 material_emissive;
...
23
 Good speedup over multiple glUniform calls
 Efficiency still dependent on size of material
Performance
Technique Draw time
Uniform 5.2 ms
BufferSubData 2.7 ms 1.9x
24
 Use glBufferSubData for dynamic parameters
 Restrictions to get effcient path
– Buffer only used as GL_UNIFORM_BUFFER
– Buffer is <= 64kb
– Buffer bound offset == 0 (glBindBufferRange)
– Offset and size passed to glBufferSubData be a multiple of 4
BufferSubData
0 2 4 6 8 10 12 14 16
314.07
332.21
future driver
Speedup
25
UpdateMatrixAndMaterialBuffer();
foreach (obj in scene) {
...
glBindBufferRange (UBO, 0, uboMatrix, obj.matrixOffset, maSize);
// iterate over different materials used
foreach ( batch in obj.materialCaches) {
glBindBufferRange (UBO, 1, uboMaterial, batch.materialOffset, mtlSize);
glMultiDrawElements (...);
}
}
BindBufferRange
26
 glBindBufferRange speed independent of data size
– Material used in framework is small (128 bytes)
– glBufferSubData will suffer more with increasing data size
Performance
Technique Draw time
glUniforms 5.2 ms
glBufferSubData 2.7 ms 1.9x
glBindBufferRange 2.0 ms 2.6x
27
 Avoid expensive CPU -> GPU copies for static data
 Upload static data once and bind subrange of buffer
– glBindBufferRange (target, index, buffer, offset, size);
– Offset aligned to GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT
– Fastest path: One buffer per binding index
BindRange
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
314.07
332.21
future driver
Speedup
28
1 2 4 6 7
 Buffer may be large and sparse
– Full update could be ‚slow‘ because of unused/padded data
– Too many small glBufferSubData calls
 Use Shader to write into Buffer (via SSBO)
– Provides compact CPU -> GPU transfer
Incremental Buffer Updates
0Target Buffer:
x x xUpdate Data:
Shader scatters data
0 3 5Update Locations:
3 5
29
 All matrices stored on GPU
– Use ARB_compute_shader for hierarchy updates 
– Send only local matrix changes, evaluate tree
Transform Tree Updates
model courtesy of PTC
30
 Update hierarchy on GPU
– Level- and Leaf-wise processing depending on workload
– world = parent.world * object
Transform Tree Updates
Hierarchy
levels
Level-wise waits for previous results
 Risk of little work per level
Leaf-wise runs to top, then concats path downwards
per thread
 Favors more total work over redundant calculations
31
– TextureBufferObject
(TBO) for matrices
– UniformBufferObject
(UBO) with array data
to save binds
– Assignment indices
passed as vertex
attribute or uniform
– Caveat: costs for
indexed fetch
Indexed in vec4 oPos;
uniform samplerBuffer matrixBuffer;
uniform materialBuffer {
Material materials[512];
};
in ivec2 vAssigns;
flat out ivec2 fAssigns;
// in vertex shader
fAssigns = vAssigns;
worldTM = getMatrix (matrixBuffer,
vAssigns.x);
wPos = worldTM * oPos;
...
// in fragment shader
color = materials[fAssigns.y].color;
...
32
setupSceneMatrixAndMaterialBuffer (scene);
foreach (obj in scene) {
setupVertexBuffer (obj.geometry);
// iterate over different materials used
foreach ( batch in obj.materialCache ) {
glVertexAttribI2i (indexAttr, batch.materialIndex, matrixIndex);
glMultiDrawElements (GL_TRIANGLES, batch.counts, GL_UNSIGNED_INT ,
batch.offsets,batched.numUsed);
}
}
}
Indexed
33
 Scene and hardware
dependent benefit
Indexed
avg 55 triangles per drawcall avg 1500 triangles per drawcall
Timer Graphicscard
Hardware K5000 K2000
BindBufferRange GPU 2.0 ms 3.3 ms
Racecar
K5000 K2000
2.4 ms 7.4 ms
Indexed GPU 1.6 ms 1.25x 3.6 ms 0.9x 2.5 ms 0.96x 7.7 ms 0.96x
BindBufferRange CPU 2.0 ms 0.5 ms
Indexed CPU 1.1 ms 1.8x 0.3 ms 1.6x
34
Recap
 glUniform
– Only for tiny data (<= vec4)
 glBufferSubData
– Dynamic data
 glBindBufferRange
– Static or GPU generated data
 Indexed
– TBO/SSBO for large/random access data
– UBO for frequent changes (bad for divergent
access)
0
0.5
1
1.5
2
2.5
314.07 332.21 future
driver
Speed relative to
glUniform
glUniform
glBufferSubData
glBindBufferRange
35
 Combine even further
– Use MultiDrawIndirect for single
drawcall
– Can store array of drawcalls on GPU
Multi Draw Indirect
Grouped and „grown“ drawcalls
Single drawcall with material/matrix
changesDrawElementsIndirect
{
GLuint count;
GLuint instanceCount;
GLuint firstIndex;
GLint baseVertex;
GLuint baseInstance;
}
DrawElementsIndirect object.drawCalls[ N ];
encodes material/matrix assignment
36
 Parameters:
– TBO and UBO as before
– ARB_shader_draw_parameters
for gl_BaseInstanceARB access
– Caveat:
 Currently slower than vertex-
divisor technique shown GTC
2013 for very low primitive
counts (improvement being
investigated)
Multi Draw Indirect
uniform samplerBuffer matrixBuffer;
uniform materialBuffer {
Material materials[256];
};
// encoded assignments in 32-bit
ivec2 vAssigns =
ivec2 (gl_BaseInstanceARB >> 16,
gl_BaseInstanceARB & 0xFFFF);
flat out ivec2 fAssigns;
// in vertex shader
fAssigns = vAssigns;
worldTM = getMatrix (matrixBuffer,
vAssigns.x);
...
// in fragment shader
color = materials[fAssigns.y].diffuse...
37
Multi Draw Indirect
setupSceneMatrixAndMaterialBuffer (scene);
glBindBuffer (GL_DRAW_INDIRECT_BUFFER, scene.indirectBuffer)
foreach ( obj in scene.objects ) {
...
// draw everything in one go
glMultiDrawElementsIndirect ( GL_TRIANGLES, GL_UNSIGNED_INT,
obj->indirectOffset, obj->numIndirects, 0 );
}
38
 Multi Draw Indirect (MDI)
is primitive dependent
Performance
avg 55 triangles per drawcall avg 1500 triangles per drawcall
Timer Graphicscard
Indexed GPU 1.6 ms
Racecar
2.5 ms
MDI w. gl_BaseInstanceARB 2.0 ms 0.8x 2.5 ms
MDI w. vertex divisor 1.3 ms 1.5x 2.5 ms
Indexed CPU 1.1 ms 0.3 ms
MDI 0.5 ms 2.2x 0.3 ms
39
 Multi Draw Indirect (MDI)
is great for non-material-
batched case
Performance
68.000 drawcommands 98.000 drawcommands
Timer Graphicscard
Indexed (not batched) GPU 6.3 ms
Racecar
8.7 ms
MDI w. vertex divisor (not batched) 2.5 ms 2.5x 3.6 ms 2.4x
Indexed (not batched) CPU 6.4 ms 8.8 ms
MDI w. vertex divisor (not batched) 0.5 ms 12.8x 0.3 ms 29.3x
40
 DrawIndirect combined with VBUM
NV_bindless_multidraw_indirect
DrawElementsIndirect
{
GLuint count;
GLuint instanceCount;
GLuint firstIndex;
GLint baseVertex;
GLuint baseInstance;
}
BindlessPtr
{
Gluint index;
Gluint reserved;
GLuint64 address;
GLuint64 length;
}
MyDrawIndirectNV
{
DrawElementsIndirect cmd;
GLuint reserved;
BindlessPtr index;
BindlessPtr vertex; // for position, normal...
}
 Caveat:
– more costly than regular MultiDrawIndirect
– Should have > 500 triangles worth of work
per drawcall
41
NV_bindless_multidraw_indirect
// enable VBUM vertexformat
...
glBindBuffer (GL_DRAW_INDIRECT_BUFFER, scene.indirectBuffer)
// draw entire scene one go 
// one call per shader
glMultiDrawElementsIndirectBindlessNV
(GL_TRIANGLES, GL_UNSIGNED_INT,
scene->indirectOffset, scene->numIndirects,
sizeof(MyDrawIndirectNV),
1 // 1 vertex attribute binding);
42
 NV_bindless_multi... is
primitive dependent
Performance
avg 55 triangles per drawcall avg 1500 triangles per drawcall
Timer Graphicscard
MDI w. gl_BaseInstanceARB GPU 2.0 ms
Racecar
2.5 ms
NV_bindless.. 2.3 ms 0.86x 2.5 ms
MDI w. gl_BaseInstanceARB CPU 0.5 ms 0.3 ms
NV_bindless.. 0.04 ms 12.5x 0.04 ms 7.5x
43
 Scalar data batching is „easy“,
how about textures?
– Test adds 4 unique textures per
material
– Tri-planar texturing, no
additional vertex attributes
Textured Materials
44
 ARB_multi_bind aeons in the making, finally here (4.4 core)
Textured Materials
// NEW ARB_multi_bind
glBindTextures (0, 4, textures);
// Alternatively EXT_direct_state_access
glBindMultiTextureEXT ( GL_TEXTURE0 + 0, GL_TEXTURE_2D, textures[0]);
glBindMultiTextureEXT ( GL_TEXTURE0 + 1, GL_TEXTURE_2D, textures[1]);
...
// classic selector way
glActiveTexture (GL_TEXTURE0 + 0);
glBindTexture (GL_TEXTURE_2D, textures[0]);
glActiveTexture (GL_TEXTURE0 + 1 ...
...
45
 NV/ARB_bindless_texture
– Manage residency
uint64 glGetTextureHandle (tex)
glMakeTextureHandleResident (hdl)
– Faster binds
glUniformHandleui64ARB (loc, hdl)
– store texture handles as 64bit
values inside buffers
Textured Materials
// NEW ARB_bindless_texture stored inside
buffer!
struct MaterialTex {
sampler2D tex0; // can be in struct
sampler2D tex1;
...
};
uniform materialTextures {
MaterialTex texs[128];
};
// in fragment shader
flat in ivec2 fAssigns;
...
color = texture ( texs[fAssigns.y] .tex0,
uv);
46
 CPU Performance
– Raw test, VBUM+VAB,
batched by material
Textured Materials
~2.400 x 4 texture binds
138 x 4 unique textures
~11.000 x 4 texture binds
66 x 4 unique textures
Timer Graphicscard
glBindTextures 6.7 ms (CPU-bound)
Racecar
1.2 ms
glUniformHandleui64
(BINDLESS)
4.3 ms 1.5x (CPU-bound) 1.0 ms 1.2x
Indexed handles inside UBO
(BINDLESS)
1.1 ms 6.0x 0.3 ms 4.0x
47
 Share geometry buffers for batching
 Group parameters for fast updating
 MultiDraw/Indirect for keeping objects
independent or remove additional loops
– BaseInstance to provide unique
index/assignments for drawcall
 Bindless to reduce validation
overhead/add flexibility
Recap
48
 Try create less total workload
 Many occluded parts in the car model (lots of vertices)
Occlusion Culling
49
 GPU friendly processing
– Matrix and bbox buffer, object buffer
– XFB/Compute or „invisible“ rendering
– Vs. old techniques: Single GPU job for ALL objects!
 Results
– „Readback“ GPU to Host
 Can use GPU to pack into bit stream
– „Indirect“ GPU to GPU
 Set DrawIndirect‘s instanceCount to 0 or 1
GPU Culling Basics
0,1,0,1,1,1,0,0,0
buffer cmdBuffer{
Command cmds[];
};
...
cmds[obj].instanceCount = visible;
50
 OpenGL 4.2+
– Depth-Pass
– Raster „invisible“ bounding boxes
 Disable Color/Depth writes
 Geometry Shader to create the three
visible box sides
 Depth buffer discards occluded
fragments (earlyZ...)
 Fragment Shader writes output:
visible[objindex] = 1
Occlusion Culling
// GLSL fragment shader
// from ARB_shader_image_load_store
layout(early_fragment_tests) in;
buffer visibilityBuffer{
int visibility[]; // cleared to 0
};
flat in int objectID; // unique per box
void main()
{
visibility[objectID] = 1;
// no atomics required (32-bit write)
}
Passing bbox fragments
enable object
Algorithm by
Evgeny Makarov, NVIDIA
depth
buffer
51
 Few changes relative to camera
 Draw each object only once
– Render last visible, fully shaded
(last)
– Test all against current depth:
(visible)
– Render newly added visible:
none, if no spatial changes made
(~last) & (visible)
– (last) = (visible)
Temporal Coherence
frame: f – 1
frame: f
last visible
bboxes occluded
bboxes pass depth
(visible)
new visible
invisible
visible
camera
camera
moved
Algorithm by
Markus Tavenrath, NVIDIA
52
Culling Readback vs Indirect
0
500
1000
1500
2000
2500
readback indirect NVindirect
Timeinmicroseconds[us] Indirect not yet as efficient to
process „invisible“ commands
For readback results, CPU has to
wait for GPU idle, and GPU may
remain idle until new work
Lower is
Better
GPU
CPU
GPU time
without culling
GPU time optimum
with culling
53
 10 x the car: 45 fps
– everything but materials duplicated in
memory, NO instancing
– 1m parts, 16k objects, 36m tris, 34m verts
 Readback culling: 145 fps 3.2x
– 6 ms CPU time, wait for sync takes 5 ms
 Stall-free culling: 115 fps 2.5x
– 1 ms CPU time using
NV_bindless_multidraw_indirect
Will it scale?
54
 Temporal culling
– very useful for object/vertex-boundedness
 Readback vs Indirect
– Readback should be delayed so GPU doesn‘t starve of work
– Indirect benefit depends on scene ( #VBOs and #primitives)
– „Graphicscard“ model didn‘t benefit of either culling on K5000
 Working towards GPU autonomous system
– (NV_bindless)/ARB_multidraw_indirect, ARB_indirect_parameters
as mechanism for GPU creating its own work
Culling Results
55
 Thank you!
– Contact
 ckubisch@nvidia.com (@pixeljetstream)
 matavenrath@nvidia.com
glFinish();
56
 VBO: vertex buffer object to store vertex data on GPU (GL server), favor
bigger buffers to have less binds, or go bindless
 IBO: index buffer object, GL_ELEMENT_ARRAY_BUFFER to store vertex indices
on GPU
 VAB: vertex attribute binding, splits vertex attribute format from vertex
buffer
 VBUM: vertex buffer unified memory, allows working with raw gpu address
pointer values, avoids binding objects completely
 UBO: uniform buffer object, data you want to access uniformly inside shaders
 TBO: texture buffer object, for random access data in shaders
 SSBO: shader storage buffer object, read & write arbitrary data structures
stored in buffers
 MDI: Multi Draw Indirect, store draw commands in buffers
Glossary

More Related Content

What's hot

Triangle Visibility buffer
Triangle Visibility bufferTriangle Visibility buffer
Triangle Visibility buffer
Wolfgang Engel
 
Frostbite on Mobile
Frostbite on MobileFrostbite on Mobile
Frostbite on Mobile
Electronic Arts / DICE
 
OpenGL 4.5 Update for NVIDIA GPUs
OpenGL 4.5 Update for NVIDIA GPUsOpenGL 4.5 Update for NVIDIA GPUs
OpenGL 4.5 Update for NVIDIA GPUs
Mark Kilgard
 
A Bit More Deferred Cry Engine3
A Bit More Deferred   Cry Engine3A Bit More Deferred   Cry Engine3
A Bit More Deferred Cry Engine3guest11b095
 
Siggraph2016 - The Devil is in the Details: idTech 666
Siggraph2016 - The Devil is in the Details: idTech 666Siggraph2016 - The Devil is in the Details: idTech 666
Siggraph2016 - The Devil is in the Details: idTech 666
Tiago Sousa
 
NVIDIA OpenGL and Vulkan Support for 2017
NVIDIA OpenGL and Vulkan Support for 2017NVIDIA OpenGL and Vulkan Support for 2017
NVIDIA OpenGL and Vulkan Support for 2017
Mark Kilgard
 
Bindless Deferred Decals in The Surge 2
Bindless Deferred Decals in The Surge 2Bindless Deferred Decals in The Surge 2
Bindless Deferred Decals in The Surge 2
Philip Hammer
 
Five Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Five Rendering Ideas from Battlefield 3 & Need For Speed: The RunFive Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Five Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Electronic Arts / DICE
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in Frostbite
Electronic Arts / DICE
 
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Johan Andersson
 
Holy smoke! Faster Particle Rendering using Direct Compute by Gareth Thomas
Holy smoke! Faster Particle Rendering using Direct Compute by Gareth ThomasHoly smoke! Faster Particle Rendering using Direct Compute by Gareth Thomas
Holy smoke! Faster Particle Rendering using Direct Compute by Gareth Thomas
AMD Developer Central
 
Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Tiago Sousa
 
Oit And Indirect Illumination Using Dx11 Linked Lists
Oit And Indirect Illumination Using Dx11 Linked ListsOit And Indirect Illumination Using Dx11 Linked Lists
Oit And Indirect Illumination Using Dx11 Linked ListsHolger Gruen
 
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
AMD Developer Central
 
Secrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologySecrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics Technology
Tiago Sousa
 
Rendering Battlefield 4 with Mantle
Rendering Battlefield 4 with MantleRendering Battlefield 4 with Mantle
Rendering Battlefield 4 with Mantle
Electronic Arts / DICE
 
Parallel Futures of a Game Engine
Parallel Futures of a Game EngineParallel Futures of a Game Engine
Parallel Futures of a Game Engine
Johan Andersson
 
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
Electronic Arts / DICE
 
Physically Based and Unified Volumetric Rendering in Frostbite
Physically Based and Unified Volumetric Rendering in FrostbitePhysically Based and Unified Volumetric Rendering in Frostbite
Physically Based and Unified Volumetric Rendering in Frostbite
Electronic Arts / DICE
 
Graphics Gems from CryENGINE 3 (Siggraph 2013)
Graphics Gems from CryENGINE 3 (Siggraph 2013)Graphics Gems from CryENGINE 3 (Siggraph 2013)
Graphics Gems from CryENGINE 3 (Siggraph 2013)
Tiago Sousa
 

What's hot (20)

Triangle Visibility buffer
Triangle Visibility bufferTriangle Visibility buffer
Triangle Visibility buffer
 
Frostbite on Mobile
Frostbite on MobileFrostbite on Mobile
Frostbite on Mobile
 
OpenGL 4.5 Update for NVIDIA GPUs
OpenGL 4.5 Update for NVIDIA GPUsOpenGL 4.5 Update for NVIDIA GPUs
OpenGL 4.5 Update for NVIDIA GPUs
 
A Bit More Deferred Cry Engine3
A Bit More Deferred   Cry Engine3A Bit More Deferred   Cry Engine3
A Bit More Deferred Cry Engine3
 
Siggraph2016 - The Devil is in the Details: idTech 666
Siggraph2016 - The Devil is in the Details: idTech 666Siggraph2016 - The Devil is in the Details: idTech 666
Siggraph2016 - The Devil is in the Details: idTech 666
 
NVIDIA OpenGL and Vulkan Support for 2017
NVIDIA OpenGL and Vulkan Support for 2017NVIDIA OpenGL and Vulkan Support for 2017
NVIDIA OpenGL and Vulkan Support for 2017
 
Bindless Deferred Decals in The Surge 2
Bindless Deferred Decals in The Surge 2Bindless Deferred Decals in The Surge 2
Bindless Deferred Decals in The Surge 2
 
Five Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Five Rendering Ideas from Battlefield 3 & Need For Speed: The RunFive Rendering Ideas from Battlefield 3 & Need For Speed: The Run
Five Rendering Ideas from Battlefield 3 & Need For Speed: The Run
 
FrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in FrostbiteFrameGraph: Extensible Rendering Architecture in Frostbite
FrameGraph: Extensible Rendering Architecture in Frostbite
 
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
 
Holy smoke! Faster Particle Rendering using Direct Compute by Gareth Thomas
Holy smoke! Faster Particle Rendering using Direct Compute by Gareth ThomasHoly smoke! Faster Particle Rendering using Direct Compute by Gareth Thomas
Holy smoke! Faster Particle Rendering using Direct Compute by Gareth Thomas
 
Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)
 
Oit And Indirect Illumination Using Dx11 Linked Lists
Oit And Indirect Illumination Using Dx11 Linked ListsOit And Indirect Illumination Using Dx11 Linked Lists
Oit And Indirect Illumination Using Dx11 Linked Lists
 
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
Vertex Shader Tricks by Bill Bilodeau - AMD at GDC14
 
Secrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologySecrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics Technology
 
Rendering Battlefield 4 with Mantle
Rendering Battlefield 4 with MantleRendering Battlefield 4 with Mantle
Rendering Battlefield 4 with Mantle
 
Parallel Futures of a Game Engine
Parallel Futures of a Game EngineParallel Futures of a Game Engine
Parallel Futures of a Game Engine
 
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
SPU-Based Deferred Shading in BATTLEFIELD 3 for Playstation 3
 
Physically Based and Unified Volumetric Rendering in Frostbite
Physically Based and Unified Volumetric Rendering in FrostbitePhysically Based and Unified Volumetric Rendering in Frostbite
Physically Based and Unified Volumetric Rendering in Frostbite
 
Graphics Gems from CryENGINE 3 (Siggraph 2013)
Graphics Gems from CryENGINE 3 (Siggraph 2013)Graphics Gems from CryENGINE 3 (Siggraph 2013)
Graphics Gems from CryENGINE 3 (Siggraph 2013)
 

Similar to OpenGL 4.4 - Scene Rendering Techniques

Rendering of Complex 3D Treemaps (GRAPP 2013)
Rendering of Complex 3D Treemaps (GRAPP 2013)Rendering of Complex 3D Treemaps (GRAPP 2013)
Rendering of Complex 3D Treemaps (GRAPP 2013)Matthias Trapp
 
Getting Started with WebGL
Getting Started with WebGLGetting Started with WebGL
Getting Started with WebGLChihoon Byun
 
Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5
firenze-gtug
 
Introduction to open gl in android droidcon - slides
Introduction to open gl in android   droidcon - slidesIntroduction to open gl in android   droidcon - slides
Introduction to open gl in android droidcon - slidestamillarasan
 
Commandlistsiggraphasia2014 141204005310-conversion-gate02
Commandlistsiggraphasia2014 141204005310-conversion-gate02Commandlistsiggraphasia2014 141204005310-conversion-gate02
Commandlistsiggraphasia2014 141204005310-conversion-gate02
RubnCuesta2
 
Vpu technology &gpgpu computing
Vpu technology &gpgpu computingVpu technology &gpgpu computing
Vpu technology &gpgpu computingArka Ghosh
 
Vpu technology &gpgpu computing
Vpu technology &gpgpu computingVpu technology &gpgpu computing
Vpu technology &gpgpu computingArka Ghosh
 
Vpu technology &gpgpu computing
Vpu technology &gpgpu computingVpu technology &gpgpu computing
Vpu technology &gpgpu computingArka Ghosh
 
Richard Salter: Using the Titanium OpenGL Module
Richard Salter: Using the Titanium OpenGL ModuleRichard Salter: Using the Titanium OpenGL Module
Richard Salter: Using the Titanium OpenGL Module
Axway Appcelerator
 
Implementation of Computational Algorithms using Parallel Programming
Implementation of Computational Algorithms using Parallel ProgrammingImplementation of Computational Algorithms using Parallel Programming
Implementation of Computational Algorithms using Parallel Programming
ijtsrd
 
GL Shading Language Document by OpenGL.pdf
GL Shading Language Document by OpenGL.pdfGL Shading Language Document by OpenGL.pdf
GL Shading Language Document by OpenGL.pdf
shaikhshehzad024
 
Wms Performance Tests Map Server Vs Geo Server
Wms Performance Tests Map Server Vs Geo ServerWms Performance Tests Map Server Vs Geo Server
Wms Performance Tests Map Server Vs Geo ServerDonnyV
 
Beginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeks
Beginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeksBeginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeks
Beginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeks
JinTaek Seo
 
Bs webgl소모임004
Bs webgl소모임004Bs webgl소모임004
Bs webgl소모임004
Seonki Paik
 
NET Systems Programming Learned the Hard Way.pptx
NET Systems Programming Learned the Hard Way.pptxNET Systems Programming Learned the Hard Way.pptx
NET Systems Programming Learned the Hard Way.pptx
petabridge
 
Vpu technology &gpgpu computing
Vpu technology &gpgpu computingVpu technology &gpgpu computing
Vpu technology &gpgpu computingArka Ghosh
 
Optimizing Games for Mobiles
Optimizing Games for MobilesOptimizing Games for Mobiles
Optimizing Games for Mobiles
St1X
 
Cascading talk in Etsy (http://www.meetup.com/cascading/events/169390262/)
Cascading talk in Etsy (http://www.meetup.com/cascading/events/169390262/)Cascading talk in Etsy (http://www.meetup.com/cascading/events/169390262/)
Cascading talk in Etsy (http://www.meetup.com/cascading/events/169390262/)
Jyotirmoy Sundi
 
openFrameworks 007 - GL
openFrameworks 007 - GL openFrameworks 007 - GL
openFrameworks 007 - GL
roxlu
 

Similar to OpenGL 4.4 - Scene Rendering Techniques (20)

Rendering of Complex 3D Treemaps (GRAPP 2013)
Rendering of Complex 3D Treemaps (GRAPP 2013)Rendering of Complex 3D Treemaps (GRAPP 2013)
Rendering of Complex 3D Treemaps (GRAPP 2013)
 
Getting Started with WebGL
Getting Started with WebGLGetting Started with WebGL
Getting Started with WebGL
 
Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5Unconventional webapps with gwt:elemental & html5
Unconventional webapps with gwt:elemental & html5
 
Introduction to open gl in android droidcon - slides
Introduction to open gl in android   droidcon - slidesIntroduction to open gl in android   droidcon - slides
Introduction to open gl in android droidcon - slides
 
Commandlistsiggraphasia2014 141204005310-conversion-gate02
Commandlistsiggraphasia2014 141204005310-conversion-gate02Commandlistsiggraphasia2014 141204005310-conversion-gate02
Commandlistsiggraphasia2014 141204005310-conversion-gate02
 
COLLADA & WebGL
COLLADA & WebGLCOLLADA & WebGL
COLLADA & WebGL
 
Vpu technology &gpgpu computing
Vpu technology &gpgpu computingVpu technology &gpgpu computing
Vpu technology &gpgpu computing
 
Vpu technology &gpgpu computing
Vpu technology &gpgpu computingVpu technology &gpgpu computing
Vpu technology &gpgpu computing
 
Vpu technology &gpgpu computing
Vpu technology &gpgpu computingVpu technology &gpgpu computing
Vpu technology &gpgpu computing
 
Richard Salter: Using the Titanium OpenGL Module
Richard Salter: Using the Titanium OpenGL ModuleRichard Salter: Using the Titanium OpenGL Module
Richard Salter: Using the Titanium OpenGL Module
 
Implementation of Computational Algorithms using Parallel Programming
Implementation of Computational Algorithms using Parallel ProgrammingImplementation of Computational Algorithms using Parallel Programming
Implementation of Computational Algorithms using Parallel Programming
 
GL Shading Language Document by OpenGL.pdf
GL Shading Language Document by OpenGL.pdfGL Shading Language Document by OpenGL.pdf
GL Shading Language Document by OpenGL.pdf
 
Wms Performance Tests Map Server Vs Geo Server
Wms Performance Tests Map Server Vs Geo ServerWms Performance Tests Map Server Vs Geo Server
Wms Performance Tests Map Server Vs Geo Server
 
Beginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeks
Beginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeksBeginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeks
Beginning direct3d gameprogramming09_shaderprogramming_20160505_jintaeks
 
Bs webgl소모임004
Bs webgl소모임004Bs webgl소모임004
Bs webgl소모임004
 
NET Systems Programming Learned the Hard Way.pptx
NET Systems Programming Learned the Hard Way.pptxNET Systems Programming Learned the Hard Way.pptx
NET Systems Programming Learned the Hard Way.pptx
 
Vpu technology &gpgpu computing
Vpu technology &gpgpu computingVpu technology &gpgpu computing
Vpu technology &gpgpu computing
 
Optimizing Games for Mobiles
Optimizing Games for MobilesOptimizing Games for Mobiles
Optimizing Games for Mobiles
 
Cascading talk in Etsy (http://www.meetup.com/cascading/events/169390262/)
Cascading talk in Etsy (http://www.meetup.com/cascading/events/169390262/)Cascading talk in Etsy (http://www.meetup.com/cascading/events/169390262/)
Cascading talk in Etsy (http://www.meetup.com/cascading/events/169390262/)
 
openFrameworks 007 - GL
openFrameworks 007 - GL openFrameworks 007 - GL
openFrameworks 007 - GL
 

Recently uploaded

How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
Elena Simperl
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 

Recently uploaded (20)

How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 

OpenGL 4.4 - Scene Rendering Techniques

  • 1. OpenGL 4.4 Scene Rendering Techniques Christoph Kubisch - ckubisch@nvidia.com Markus Tavenrath - matavenrath@nvidia.com
  • 2. 2  Scene complexity increases – Deep hierarchies, traversal expensive – Large objects split up into a lot of little pieces, increased draw call count – Unsorted rendering, lot of state changes  CPU becomes bottleneck when rendering those scenes  Removing SceneGraph traversal: – http://on-demand.gputechconf.com/gtc/2013/presentations/S3032-Advanced- Scenegraph-Rendering-Pipeline.pdf Scene Rendering models courtesy of PTC
  • 3. 3  Harder to render „Graphicscard“ efficiently than „Racecar“ Challenge not necessarily obvious  650 000 Triangles  68 000 Parts  ~ 10 Triangles per part  3 700 000 Triangles  98 000 Parts  ~ 37 Triangles per part CPU App/GL GPU GPU idle
  • 4. 4  Avoid data redundancy – Data stored once, referenced multiple times – Update only once (less host to gpu transfers)  Increase GPU workload per job (batching) – Further cuts API calls – Less driver CPU work  Minimize CPU/GPU interaction – Allow GPU to update its own data – Low API usage when scene is changed little – E.g. GPU-based culling Enabling GPU Scalability
  • 5. 5  Avoids classic SceneGraph design  Geometry – Vertex & Index-Buffer (VBO & IBO) – Parts (CAD features)  Material  Matrix Hierarchy  Object References Geometry, Matrix, Materials Rendering Research Framework Same geometry multiple objects Same geometry (fan) multiple parts
  • 6. 6  Benchmark System – Core i7 860 2.8Ghz – Kepler Quadro K5000 – Driver upcoming this summer  Showing evolution of techniques – Render time basic technique 32ms (31fps), CPU limited – Render time best technique 1.3ms (769fps) – Total speedup of 24.6x Performance baseline 110 geometries, 66 materials 2500 objects
  • 7. 7 foreach (obj in scene) { setMatrix (obj.matrix); // iterate over different materials used foreach (part in obj.geometry.parts) { setupGeometryBuffer (part.geometry); // sets vertex and index buffer setMaterial_if_changed (part.material); drawPart (part); } } Basic technique 1: 32ms CPU-bound  Classic uniforms for parameters  VBO bind per part, drawcall per part, 68k binds/frame
  • 8. 8 Basic technique 2: 17 ms CPU-bound  Classic uniforms for parameters  VBO bind per geometry, drawcall per part, 2.5k binds/frame foreach (obj in scene) { setupGeometryBuffer (obj.geometry); // sets vertex and index buffer setMatrix (obj.matrix); // iterate over parts foreach (part in obj.geometry.parts) { setMaterial_if_changed (part.material); drawPart (part); } }
  • 9. 9  Combine parts with same state – Object‘s part cache must be rebuilt based on material/enabled state Drawcall Grouping a b c d e f a b+c fd e Parts with different materials in geometry Grouped and „grown“ drawcallsforeach (obj in scene) { // sets vertex and index buffer setupGeometryBuffer (obj.geometry); setMatrix (obj.matrix); // iterate over material batches: 6.8 ms  -> 2.5x foreach (batch in obj.materialCache) { setMaterial (batch.material); drawBatch (batch.data); } }
  • 10. 10 drawBatch (batch) { // 6.8 ms foreach range in batch.ranges { glDrawElements (GL_.., range.count, .., range.offset); } } drawBatch (batch) { // 6.1 ms  -> 1.1x glMultiDrawElements (GL_.., batch.counts[], .., batch.offsets[], batch.numRanges); }  glMultiDrawElements supports multiple index buffer ranges glMultiDrawElements (GL 1.4) a b c d e f a b+c fd e offsets[] and counts[] per batch for glMultiDrawElements Index Buffer Object
  • 11. 11 foreach (obj in scene) { setupGeometryBuffer (obj.geometry); setMatrix (obj.matrix); // iterate over different materials used foreach (batch in obj.materialCache) { setMaterial (batch.material); drawBatch (batch.geometry); } } Vertex Setup
  • 12. 12 Vertex Format Description Type Offset StrideIndex 0 1 2 float3 float3 float2 0 12 0 24 8 Stream 0 1 Name position normal texcoord Buffer=StreamAttribute
  • 13. 13  One call required for each attribute and stream  Format is being passed when updating ‚streams‘  Each attribute could be considered as one stream Vertex Setup VBO (GL 2.1) void setupVertexBuffer (obj) { glBindBuffer (GL_ARRAY_BUFFER, obj.positionNormal); glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 24, 0); // pos glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 24, 12); // normal glBindBuffer (GL_ARRAY_BUFFER, obj.texcoord); glVertexAttribPointer (2, 2, GL_FLOAT, GL_FALSE, 8, 0); // texcoord }
  • 14. 14 Vertex Setup VAB (GL 4.3) void setupVertexBuffer(obj) { if formatChanged(obj) { glVertexAttribFormat (0, 3, GL_FLOAT, false, 0); // position glVertexAttribFormat (1, 3, GL_FLOAT, false, 12); // normal glVertexAttribFormat (2, 2, GL_FLOAT, false, 0); // texcoord glVertexAttribBinding (0, 0); // position -> stream 0 glVertexAttribBinding (1, 0); // normal -> stream 0 glVertexAttribBinding (2, 1); // texcoord -> stream 1 } // stream, buffer, offset, stride glBindVertexBuffer (0 , obj.positionNormal, 0 , 24 ); glBindVertexBuffer (1 , obj.texcoord , 0 , 8 ); }  ARB_vertex_attrib_binding separates format and stream
  • 15. 15 Vertex Setup VBUM  NV_vertex_buffer_unified_memory uses buffer addresses glEnableClientState (GL_VERTEX_ATTRIB_UNIFIED_NV); // enable once void setupVertexBuffer(obj) { if formatChanged(obj) { glVertexAttribFormat (0, 3, . . . // stream, buffer, offset, stride glBindVertexBuffer (0, 0, 0, 24); // dummy binds glBindVertexBuffer (1, 0, 0, 8); // to update stride } // no binds, but 64-bit gpu addresses stream glBufferAddressRangeNV (GL_VERTEX_ARRAY_ADDRESS_NV, 0, addr0, length0); glBufferAddressRangeNV (GL_VERTEX_ARRAY_ADDRESS_NV, 1, addr1, length1); }
  • 16. 16 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 VBO VAB VAB+VBUM CPU speedup High binding frequency – Framework uses only one stream and three attributes – VAB benefit depends on vertex buffer bind frequency Vertex Setup
  • 17. 17 foreach (obj in scene) { setupGeometryBuffer (obj.geometry); setMatrix (obj.matrix); // once per object // iterate over different materials used foreach (batch in obj.materialCaches) { setMaterial (batch.material); // once per batch drawBatch (batch.geometry); } } Parameter Setup
  • 18. 18  Group parameters by frequency of change  Generate GLSL shader parameters Parameter Setup Effect "Phong" { Group "material" { vec4 "ambient" vec4 "diffuse" vec4 "specular" } Group "object" { mat4 "world" mat4 "worldIT" } Group "view" { vec4 "viewProjTM" } ... Code ... }  OpenGL 2 uniforms  OpenGL 3.x, 4.x buffers
  • 19. 19  glUniform (2.x) – one glUniform per parameter (simple) – one glUniform array call for all parameters (ugly) Uniform // matrices uniform mat4 matrix_world; uniform mat4 matrix_worldIT; // material uniform vec4 material_diffuse; uniform vec4 material_emissive; ... // material fast but „ugly“ uniform vec4 material_data[8]; #define material_diffuse material_data[0] ...
  • 20. 20 foreach (obj in scene) { ... glUniform (matrixLoc, obj.matrix); glUniform (matrixITLoc, obj.matrixIT); // iterate over different materials used foreach ( batch in obj.materialCaches) { glUniform (frontDiffuseLoc, batch.material.frontDiffuse); glUniform (frontAmbientLoc, batch.material.frontAmbient); glUniform (...) ... glMultiDrawElements (...); } } Uniform
  • 21. 21 glBindBufferBase (GL_UNIFORM_BUFFER, 0, uboMatrix); glBindBufferBase (GL_UNIFORM_BUFFER, 1, uboMaterial); foreach (obj in scene) { ... glNamedBufferSubDataEXT (uboMatrix, 0, maSize, obj.matrix); // iterate over different materials used foreach ( batch in obj.materialCaches) { glNamedBufferSubDataEXT (uboMaterial, 1, mtlSize, batch.material); glMultiDrawElements (...); } } BufferSubData
  • 22. 22  Changes to existing shaders are minimal – Surround block of parameters with uniform block – Actual shader code remains unchanged  Group parameters by frequency Uniform to UBO transition layout(std140,binding=0) uniform matrixBuffer { mat4 matrix_world; mat4 matrix_worldIT; }; layout(std140,binding=1) uniform materialBuffer { vec4 material_diffuse; vec4 material_emissive; ... }; // matrices uniform mat4 matrix_world; uniform mat4 matrix_worldIT; // material uniform vec4 material_diffuse; uniform vec4 material_emissive; ...
  • 23. 23  Good speedup over multiple glUniform calls  Efficiency still dependent on size of material Performance Technique Draw time Uniform 5.2 ms BufferSubData 2.7 ms 1.9x
  • 24. 24  Use glBufferSubData for dynamic parameters  Restrictions to get effcient path – Buffer only used as GL_UNIFORM_BUFFER – Buffer is <= 64kb – Buffer bound offset == 0 (glBindBufferRange) – Offset and size passed to glBufferSubData be a multiple of 4 BufferSubData 0 2 4 6 8 10 12 14 16 314.07 332.21 future driver Speedup
  • 25. 25 UpdateMatrixAndMaterialBuffer(); foreach (obj in scene) { ... glBindBufferRange (UBO, 0, uboMatrix, obj.matrixOffset, maSize); // iterate over different materials used foreach ( batch in obj.materialCaches) { glBindBufferRange (UBO, 1, uboMaterial, batch.materialOffset, mtlSize); glMultiDrawElements (...); } } BindBufferRange
  • 26. 26  glBindBufferRange speed independent of data size – Material used in framework is small (128 bytes) – glBufferSubData will suffer more with increasing data size Performance Technique Draw time glUniforms 5.2 ms glBufferSubData 2.7 ms 1.9x glBindBufferRange 2.0 ms 2.6x
  • 27. 27  Avoid expensive CPU -> GPU copies for static data  Upload static data once and bind subrange of buffer – glBindBufferRange (target, index, buffer, offset, size); – Offset aligned to GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT – Fastest path: One buffer per binding index BindRange 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 314.07 332.21 future driver Speedup
  • 28. 28 1 2 4 6 7  Buffer may be large and sparse – Full update could be ‚slow‘ because of unused/padded data – Too many small glBufferSubData calls  Use Shader to write into Buffer (via SSBO) – Provides compact CPU -> GPU transfer Incremental Buffer Updates 0Target Buffer: x x xUpdate Data: Shader scatters data 0 3 5Update Locations: 3 5
  • 29. 29  All matrices stored on GPU – Use ARB_compute_shader for hierarchy updates  – Send only local matrix changes, evaluate tree Transform Tree Updates model courtesy of PTC
  • 30. 30  Update hierarchy on GPU – Level- and Leaf-wise processing depending on workload – world = parent.world * object Transform Tree Updates Hierarchy levels Level-wise waits for previous results  Risk of little work per level Leaf-wise runs to top, then concats path downwards per thread  Favors more total work over redundant calculations
  • 31. 31 – TextureBufferObject (TBO) for matrices – UniformBufferObject (UBO) with array data to save binds – Assignment indices passed as vertex attribute or uniform – Caveat: costs for indexed fetch Indexed in vec4 oPos; uniform samplerBuffer matrixBuffer; uniform materialBuffer { Material materials[512]; }; in ivec2 vAssigns; flat out ivec2 fAssigns; // in vertex shader fAssigns = vAssigns; worldTM = getMatrix (matrixBuffer, vAssigns.x); wPos = worldTM * oPos; ... // in fragment shader color = materials[fAssigns.y].color; ...
  • 32. 32 setupSceneMatrixAndMaterialBuffer (scene); foreach (obj in scene) { setupVertexBuffer (obj.geometry); // iterate over different materials used foreach ( batch in obj.materialCache ) { glVertexAttribI2i (indexAttr, batch.materialIndex, matrixIndex); glMultiDrawElements (GL_TRIANGLES, batch.counts, GL_UNSIGNED_INT , batch.offsets,batched.numUsed); } } } Indexed
  • 33. 33  Scene and hardware dependent benefit Indexed avg 55 triangles per drawcall avg 1500 triangles per drawcall Timer Graphicscard Hardware K5000 K2000 BindBufferRange GPU 2.0 ms 3.3 ms Racecar K5000 K2000 2.4 ms 7.4 ms Indexed GPU 1.6 ms 1.25x 3.6 ms 0.9x 2.5 ms 0.96x 7.7 ms 0.96x BindBufferRange CPU 2.0 ms 0.5 ms Indexed CPU 1.1 ms 1.8x 0.3 ms 1.6x
  • 34. 34 Recap  glUniform – Only for tiny data (<= vec4)  glBufferSubData – Dynamic data  glBindBufferRange – Static or GPU generated data  Indexed – TBO/SSBO for large/random access data – UBO for frequent changes (bad for divergent access) 0 0.5 1 1.5 2 2.5 314.07 332.21 future driver Speed relative to glUniform glUniform glBufferSubData glBindBufferRange
  • 35. 35  Combine even further – Use MultiDrawIndirect for single drawcall – Can store array of drawcalls on GPU Multi Draw Indirect Grouped and „grown“ drawcalls Single drawcall with material/matrix changesDrawElementsIndirect { GLuint count; GLuint instanceCount; GLuint firstIndex; GLint baseVertex; GLuint baseInstance; } DrawElementsIndirect object.drawCalls[ N ]; encodes material/matrix assignment
  • 36. 36  Parameters: – TBO and UBO as before – ARB_shader_draw_parameters for gl_BaseInstanceARB access – Caveat:  Currently slower than vertex- divisor technique shown GTC 2013 for very low primitive counts (improvement being investigated) Multi Draw Indirect uniform samplerBuffer matrixBuffer; uniform materialBuffer { Material materials[256]; }; // encoded assignments in 32-bit ivec2 vAssigns = ivec2 (gl_BaseInstanceARB >> 16, gl_BaseInstanceARB & 0xFFFF); flat out ivec2 fAssigns; // in vertex shader fAssigns = vAssigns; worldTM = getMatrix (matrixBuffer, vAssigns.x); ... // in fragment shader color = materials[fAssigns.y].diffuse...
  • 37. 37 Multi Draw Indirect setupSceneMatrixAndMaterialBuffer (scene); glBindBuffer (GL_DRAW_INDIRECT_BUFFER, scene.indirectBuffer) foreach ( obj in scene.objects ) { ... // draw everything in one go glMultiDrawElementsIndirect ( GL_TRIANGLES, GL_UNSIGNED_INT, obj->indirectOffset, obj->numIndirects, 0 ); }
  • 38. 38  Multi Draw Indirect (MDI) is primitive dependent Performance avg 55 triangles per drawcall avg 1500 triangles per drawcall Timer Graphicscard Indexed GPU 1.6 ms Racecar 2.5 ms MDI w. gl_BaseInstanceARB 2.0 ms 0.8x 2.5 ms MDI w. vertex divisor 1.3 ms 1.5x 2.5 ms Indexed CPU 1.1 ms 0.3 ms MDI 0.5 ms 2.2x 0.3 ms
  • 39. 39  Multi Draw Indirect (MDI) is great for non-material- batched case Performance 68.000 drawcommands 98.000 drawcommands Timer Graphicscard Indexed (not batched) GPU 6.3 ms Racecar 8.7 ms MDI w. vertex divisor (not batched) 2.5 ms 2.5x 3.6 ms 2.4x Indexed (not batched) CPU 6.4 ms 8.8 ms MDI w. vertex divisor (not batched) 0.5 ms 12.8x 0.3 ms 29.3x
  • 40. 40  DrawIndirect combined with VBUM NV_bindless_multidraw_indirect DrawElementsIndirect { GLuint count; GLuint instanceCount; GLuint firstIndex; GLint baseVertex; GLuint baseInstance; } BindlessPtr { Gluint index; Gluint reserved; GLuint64 address; GLuint64 length; } MyDrawIndirectNV { DrawElementsIndirect cmd; GLuint reserved; BindlessPtr index; BindlessPtr vertex; // for position, normal... }  Caveat: – more costly than regular MultiDrawIndirect – Should have > 500 triangles worth of work per drawcall
  • 41. 41 NV_bindless_multidraw_indirect // enable VBUM vertexformat ... glBindBuffer (GL_DRAW_INDIRECT_BUFFER, scene.indirectBuffer) // draw entire scene one go  // one call per shader glMultiDrawElementsIndirectBindlessNV (GL_TRIANGLES, GL_UNSIGNED_INT, scene->indirectOffset, scene->numIndirects, sizeof(MyDrawIndirectNV), 1 // 1 vertex attribute binding);
  • 42. 42  NV_bindless_multi... is primitive dependent Performance avg 55 triangles per drawcall avg 1500 triangles per drawcall Timer Graphicscard MDI w. gl_BaseInstanceARB GPU 2.0 ms Racecar 2.5 ms NV_bindless.. 2.3 ms 0.86x 2.5 ms MDI w. gl_BaseInstanceARB CPU 0.5 ms 0.3 ms NV_bindless.. 0.04 ms 12.5x 0.04 ms 7.5x
  • 43. 43  Scalar data batching is „easy“, how about textures? – Test adds 4 unique textures per material – Tri-planar texturing, no additional vertex attributes Textured Materials
  • 44. 44  ARB_multi_bind aeons in the making, finally here (4.4 core) Textured Materials // NEW ARB_multi_bind glBindTextures (0, 4, textures); // Alternatively EXT_direct_state_access glBindMultiTextureEXT ( GL_TEXTURE0 + 0, GL_TEXTURE_2D, textures[0]); glBindMultiTextureEXT ( GL_TEXTURE0 + 1, GL_TEXTURE_2D, textures[1]); ... // classic selector way glActiveTexture (GL_TEXTURE0 + 0); glBindTexture (GL_TEXTURE_2D, textures[0]); glActiveTexture (GL_TEXTURE0 + 1 ... ...
  • 45. 45  NV/ARB_bindless_texture – Manage residency uint64 glGetTextureHandle (tex) glMakeTextureHandleResident (hdl) – Faster binds glUniformHandleui64ARB (loc, hdl) – store texture handles as 64bit values inside buffers Textured Materials // NEW ARB_bindless_texture stored inside buffer! struct MaterialTex { sampler2D tex0; // can be in struct sampler2D tex1; ... }; uniform materialTextures { MaterialTex texs[128]; }; // in fragment shader flat in ivec2 fAssigns; ... color = texture ( texs[fAssigns.y] .tex0, uv);
  • 46. 46  CPU Performance – Raw test, VBUM+VAB, batched by material Textured Materials ~2.400 x 4 texture binds 138 x 4 unique textures ~11.000 x 4 texture binds 66 x 4 unique textures Timer Graphicscard glBindTextures 6.7 ms (CPU-bound) Racecar 1.2 ms glUniformHandleui64 (BINDLESS) 4.3 ms 1.5x (CPU-bound) 1.0 ms 1.2x Indexed handles inside UBO (BINDLESS) 1.1 ms 6.0x 0.3 ms 4.0x
  • 47. 47  Share geometry buffers for batching  Group parameters for fast updating  MultiDraw/Indirect for keeping objects independent or remove additional loops – BaseInstance to provide unique index/assignments for drawcall  Bindless to reduce validation overhead/add flexibility Recap
  • 48. 48  Try create less total workload  Many occluded parts in the car model (lots of vertices) Occlusion Culling
  • 49. 49  GPU friendly processing – Matrix and bbox buffer, object buffer – XFB/Compute or „invisible“ rendering – Vs. old techniques: Single GPU job for ALL objects!  Results – „Readback“ GPU to Host  Can use GPU to pack into bit stream – „Indirect“ GPU to GPU  Set DrawIndirect‘s instanceCount to 0 or 1 GPU Culling Basics 0,1,0,1,1,1,0,0,0 buffer cmdBuffer{ Command cmds[]; }; ... cmds[obj].instanceCount = visible;
  • 50. 50  OpenGL 4.2+ – Depth-Pass – Raster „invisible“ bounding boxes  Disable Color/Depth writes  Geometry Shader to create the three visible box sides  Depth buffer discards occluded fragments (earlyZ...)  Fragment Shader writes output: visible[objindex] = 1 Occlusion Culling // GLSL fragment shader // from ARB_shader_image_load_store layout(early_fragment_tests) in; buffer visibilityBuffer{ int visibility[]; // cleared to 0 }; flat in int objectID; // unique per box void main() { visibility[objectID] = 1; // no atomics required (32-bit write) } Passing bbox fragments enable object Algorithm by Evgeny Makarov, NVIDIA depth buffer
  • 51. 51  Few changes relative to camera  Draw each object only once – Render last visible, fully shaded (last) – Test all against current depth: (visible) – Render newly added visible: none, if no spatial changes made (~last) & (visible) – (last) = (visible) Temporal Coherence frame: f – 1 frame: f last visible bboxes occluded bboxes pass depth (visible) new visible invisible visible camera camera moved Algorithm by Markus Tavenrath, NVIDIA
  • 52. 52 Culling Readback vs Indirect 0 500 1000 1500 2000 2500 readback indirect NVindirect Timeinmicroseconds[us] Indirect not yet as efficient to process „invisible“ commands For readback results, CPU has to wait for GPU idle, and GPU may remain idle until new work Lower is Better GPU CPU GPU time without culling GPU time optimum with culling
  • 53. 53  10 x the car: 45 fps – everything but materials duplicated in memory, NO instancing – 1m parts, 16k objects, 36m tris, 34m verts  Readback culling: 145 fps 3.2x – 6 ms CPU time, wait for sync takes 5 ms  Stall-free culling: 115 fps 2.5x – 1 ms CPU time using NV_bindless_multidraw_indirect Will it scale?
  • 54. 54  Temporal culling – very useful for object/vertex-boundedness  Readback vs Indirect – Readback should be delayed so GPU doesn‘t starve of work – Indirect benefit depends on scene ( #VBOs and #primitives) – „Graphicscard“ model didn‘t benefit of either culling on K5000  Working towards GPU autonomous system – (NV_bindless)/ARB_multidraw_indirect, ARB_indirect_parameters as mechanism for GPU creating its own work Culling Results
  • 55. 55  Thank you! – Contact  ckubisch@nvidia.com (@pixeljetstream)  matavenrath@nvidia.com glFinish();
  • 56. 56  VBO: vertex buffer object to store vertex data on GPU (GL server), favor bigger buffers to have less binds, or go bindless  IBO: index buffer object, GL_ELEMENT_ARRAY_BUFFER to store vertex indices on GPU  VAB: vertex attribute binding, splits vertex attribute format from vertex buffer  VBUM: vertex buffer unified memory, allows working with raw gpu address pointer values, avoids binding objects completely  UBO: uniform buffer object, data you want to access uniformly inside shaders  TBO: texture buffer object, for random access data in shaders  SSBO: shader storage buffer object, read & write arbitrary data structures stored in buffers  MDI: Multi Draw Indirect, store draw commands in buffers Glossary