Brink Preferred Rendering With OpenGL

download Brink Preferred Rendering With OpenGL

of 57

Transcript of Brink Preferred Rendering With OpenGL

  • 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!