of 57
7/29/2019 Brink Preferred Rendering With OpenGL
1/57
Gra
7/29/2019 Brink Preferred Rendering With OpenGL
2/57
PC rendering overview state, shaders, occlusion queries
virtual texturing
bindless vertex attributes
debugging OpenGL lessons learned
7/29/2019 Brink Preferred Rendering With OpenGL
3/57
Founded 2001Mod team gone pro
Developed Enemy Territorygames with id Software
Just finished Brink withBethesda Softworks
7/29/2019 Brink Preferred Rendering With OpenGL
4/57
7/29/2019 Brink Preferred Rendering With OpenGL
5/57
7/29/2019 Brink Preferred Rendering With OpenGL
6/57
thin, lightweight renderer, data-driven
mostly GL2.x pipeline with GL3.x shaders Vertex Buffer Objects, Frame Buffer Objects
Vertex- and Fragment-programs
Pixel Buffer Objects for asynchronous VT-readback
7/29/2019 Brink Preferred Rendering With OpenGL
7/57
fully dynamic lighting, deferred, fat atribute buffe fast content-iterations on lighting
fast shader-development
fast dynamic lighting
more work for static lighting
7/29/2019 Brink Preferred Rendering With OpenGL
8/57
7/29/2019 Brink Preferred Rendering With OpenGL
9/57
7/29/2019 Brink Preferred Rendering With OpenGL
10/57
7/29/2019 Brink Preferred Rendering With OpenGL
11/57
7/29/2019 Brink Preferred Rendering With OpenGL
12/57
each pass is a list of drawCmds sorted to reduce statechange
depth:
attribute:
lights:
translucent:
7/29/2019 Brink Preferred Rendering With OpenGL
13/57
static set of handwritten shaders available to art written by gfx-programmers and tech-artists together w
python-scripts to generate variations with different $de
~150 files, ~350 shader-combinations, ~3sec cotime
7/29/2019 Brink Preferred Rendering With OpenGL
14/57
Regular preprocessor functionality (some now natively in glsl)
$include "inc/preferred_glsl.inc"$define PREFERRED_RENDERING$ifdef PREFERRED_RENDERING
return bestValue();$else
return fuglyHack();
$endif
7/29/2019 Brink Preferred Rendering With OpenGL
15/57
Regular preprocessor functionality (some now natively in glsl)
$include "inc/preferred_glsl.inc"$define PREFERRED_RENDERING$ifdef PREFERRED_RENDERING
return bestValue();$else
return fuglyHack();
$endif// vertex-attributes looked up by namevec4 vertexColor = $colorAttrib;
//uniforms / textures mapped on shader-loadvertexColor = vertexColor * $colorModulate + $colorAvec4 diffuse = texture( $diffMap, texCoord ) * vert
7/29/2019 Brink Preferred Rendering With OpenGL
16/57
area and frustum-culled before OCQ
7/29/2019 Brink Preferred Rendering With OpenGL
17/57
area and frustum-culled before OCQ
render world-space bboxes / light-frustum if predicted visible, issue OCQ during rendering
~60 avg, ~200 max OCQ per frame~0.5ms
7/29/2019 Brink Preferred Rendering With OpenGL
18/57
initial version stalled on frame n+1 proved to be a bottleneck
7/29/2019 Brink Preferred Rendering With OpenGL
19/57
if not ready, assume nothing changed do not issue new OCQ
expand bbox in view-movement-direction to previsibility
7/29/2019 Brink Preferred Rendering With OpenGL
20/57
7/29/2019 Brink Preferred Rendering With OpenGL
21/57
7/29/2019 Brink Preferred Rendering With OpenGL
22/57
7/29/2019 Brink Preferred Rendering With OpenGL
23/57
only load the texels you need same texel-density everywhere on screen
7/29/2019 Brink Preferred Rendering With OpenGL
24/57
only load the texels you need same texel-density everywhere on screen
reduces complexity for artists texture however you want, as long as it fits
7/29/2019 Brink Preferred Rendering With OpenGL
25/57
only load the texels you need same texel-density everywhere on screen
reduces complexity for artists texture however you want, as long as it fits
reduces dependency between drawcalls everything uses the same texture
...actually we have multiple pagefiles
7/29/2019 Brink Preferred Rendering With OpenGL
26/57
7/29/2019 Brink Preferred Rendering With OpenGL
27/57
7/29/2019 Brink Preferred Rendering With OpenGL
28/57
processing mapped memory from separate thre PBO mapped pointer valid in all threads
7/29/2019 Brink Preferred Rendering With OpenGL
29/57
processing mapped memory from separate thre PBO mapped pointer valid in all threads
minimum 1 frame delay for async readback 2+ frames delayed for multi-GPU
7/29/2019 Brink Preferred Rendering With OpenGL
30/57
processing mapped memory from separate thre PBO mapped pointer valid in all threads
minimum 1 frame delay for async readback 2+ frames delayed for multi-GPU
anisotropic mip-selection, bi-linear filtering
7/29/2019 Brink Preferred Rendering With OpenGL
31/57
1. decouples vertex-format from vertex-pointers
2. provides direct GPU-pointer, reducing indirectiooverhead in driver
GL_NV_vertex_buffer_unified_memory
GL_NV_shader_buffer_load
7/29/2019 Brink Preferred Rendering With OpenGL
32/57
glVertexAttribPointerARB(ATTR_COL, 4, GL_UNSIGNEDGL_TRUE, vertsiz, ofs_co
glBufferAddressRangeNV( GL_VERTEX_ATTRIB_ARRAY_ADD
ATTR_COL, vbo_gpu_addr+ofs
vbo_gpu_siz-ofs_col );glVertexAttribFormatNV(ATTR_COL, 4, GL_UNSIGNED_B
GL_TRUE, vertsiz );
7/29/2019 Brink Preferred Rendering With OpenGL
33/57
implementation revealed the slack in our attribu
drivers are forgiving this was the main work - writing the code was easy
use debug-context to spare crashes (thanks Jef
7/29/2019 Brink Preferred Rendering With OpenGL
34/57
implementation revealed the slack in our attribu
drivers are forgiving this was the main work - writing the code was easy
use debug-context to spare crashes (thanks Jef
practically got rid of vertex-attribute cpu-overhea 5-10% of CPU frame-time
not practical for frame-temporary allocationsGetting GPU-address takes time.
7/29/2019 Brink Preferred Rendering With OpenGL
35/57
gDebugger / glIntercept for cmdBuffer debuggin useful for checking correct textures/shaders/"meshes
7/29/2019 Brink Preferred Rendering With OpenGL
36/57
gDebugger / glIntercept for cmdBuffer debuggin useful for checking correct textures/shaders/"meshes
Nsight / GPU PerfStudio almost useful for timing NSight has actual start/end drawcall GPU-times!
Only way to get this. Try it today! Neither is very mature for OpenGL
7/29/2019 Brink Preferred Rendering With OpenGL
37/57
gDebugger / glIntercept for cmdBuffer debuggin useful for checking correct textures/shaders/"meshes
Nsight / GPU PerfStudio almost useful for timing NSight has actual start/end drawcall GPU-times!
Only way to get this. Try it today! Neither is very mature for OpenGL
no tools currently shows FBO or geometry
7/29/2019 Brink Preferred Rendering With OpenGL
38/57
hot-reloadable assets shaders / textures / meshes / assets
runtime-modifying shaders for debugging
7/29/2019 Brink Preferred Rendering With OpenGL
39/57
hot-reloadable assets shaders / textures / meshes / assets
runtime-modifying shaders for debugging
configurable render-stages
various visualization modes wire, batches, info on obj, lights, ocq etc.
show textures / rendertargets, write to files
7/29/2019 Brink Preferred Rendering With OpenGL
40/57
7/29/2019 Brink Preferred Rendering With OpenGL
41/57
7/29/2019 Brink Preferred Rendering With OpenGL
42/57
7/29/2019 Brink Preferred Rendering With OpenGL
43/57
7/29/2019 Brink Preferred Rendering With OpenGL
44/57
full OpenGL-statedump write to file and diff
queryTimers for profiling Make sure to pair with CPU-timings to find all bottlene
7/29/2019 Brink Preferred Rendering With OpenGL
45/57
do not trust state: Reset per frame
7/29/2019 Brink Preferred Rendering With OpenGL
46/57
do not trust state: Reset per frame
use the debug context. Add it today! ~1 hour
7/29/2019 Brink Preferred Rendering With OpenGL
47/57
do not trust state: Reset per frame
use the debug context. Add it today! ~1 hour
no vendor-independent solutions exists for duallaptops
7/29/2019 Brink Preferred Rendering With OpenGL
48/57
do not trust state: Reset per frame
use the debug context. Add it today! ~1 hour
no vendor-independent solutions exists for duallaptops
keep a small code-setup for tests driver teams appreciate small reproduction-programs
source-code too
7/29/2019 Brink Preferred Rendering With OpenGL
49/57
OpenGL works for AAA games
OpenGL-support was never an issue dx10 on Windows XP
7/29/2019 Brink Preferred Rendering With OpenGL
50/57
OpenGL works for AAA games
OpenGL-support was never an issue dx10 on Windows XP
responsive IHVs
AAA can force updated drivers
7/29/2019 Brink Preferred Rendering With OpenGL
51/57
7/29/2019 Brink Preferred Rendering With OpenGL
52/57
7/29/2019 Brink Preferred Rendering With OpenGL
53/57
light-weight Display Lists
this is our current console setup! ideally, we would still like to be able to set state... sorr
GPU self-feed would be great!
7/29/2019 Brink Preferred Rendering With OpenGL
54/57
http://brinkthegame.com/
http://origin-developer.nvidia.com/object/bindless_graphics.
http://altdevblogaday.com/2011/06/23/improving-opengl-error
http://glintercept.nutty.org/
http://developer.amd.com/tools/gDEBugger/Pages/default.as http://parallelnsight.nvidia.com/
7/29/2019 Brink Preferred Rendering With OpenGL
55/57
Arnout van Meer / Splash Damage Romain Toutain / Splash Damage
Simon Green, Phil Scott, Jeff Bolz of NVIDIA fam
Nicolas Thibieroz, Kevin Strange of AMD fame
All images are copyright of their respective owners
7/29/2019 Brink Preferred Rendering With OpenGL
56/57
Were hiring: www.splashdamage.co
@splashdamage Splash Da
7/29/2019 Brink Preferred Rendering With OpenGL
57/57
Ask us anything!