|
|
(One intermediate revision by one user not shown) |
Line 1: |
Line 1: |
− | == Rendering System of OpenSimulator Viewer v1 ==
| + | {{ViewerQuicklinks}} |
| | | |
− | The OpenSimulator Viewer uses OpenGL to interface with the graphics hardware. (Should this be replaced or should it remain the same?)
| |
| | | |
− | Rendering in the viewer starts in llviewerdisplay.cpp in the display() method. | + | == Rendering System of OpenSimulator Viewer v1 == |
− | | + | |
− | Rendering follows this flow of events:
| + | |
− | | + | |
− | * check window state and client state
| + | |
− | | + | |
− | Don't render if window is minimized.
| + | |
− | | + | |
− | Don't render if client is in startup state.
| + | |
− | | + | |
− | If client is in teleport mode only draw a static screen and progress bar.
| + | |
− | | + | |
− | If client requested a logout don't draw anything else.
| + | |
− | | + | |
− | '''prepare for next frame:'''
| + | |
− | | + | |
− | * update camera
| + | |
− | | + | |
− | * clear buffer, for drawing of dynamic textures
| + | |
− | | + | |
− | * setup rendering
| + | |
− | | + | |
− | * reset lights to OS defaults
| + | |
− | | + | |
− | '''update window and dynamic textures:'''
| + | |
− | | + | |
− | * update (draw) dynamic(/render-to-texture) textures
| + | |
− | | + | |
− | for each dynamic texture:
| + | |
− | | + | |
− | -> save camera and viewport and clear the depthbuffer if required
| + | |
− | | + | |
− | -> render to framebuffer
| + | |
− | | + | |
− | -> use glCopyTexSubImage2D to copy results to texture
| + | |
− | | + | |
− | -> restore camera and viewport
| + | |
− | | + | |
− | * if any dynamic textures were updated clear color and depth buffer
| + | |
− | | + | |
− | * set viewport up (with offsets and window dimensions)
| + | |
− | | + | |
− | '''update scene:'''
| + | |
− | | + | |
− | * set camera up
| + | |
− | | + | |
− | display_camera_update() creates projection matrix and clip distance
| + | |
− | | + | |
− | * update HUD
| + | |
− | | + | |
− | * update geometry
| + | |
− | | + | |
− | * cull geometry
| + | |
− | | + | |
− | * clear/flush last frame
| + | |
− | | + | |
− | * update images (?)
| + | |
− | | + | |
− | * state sorting
| + | |
− | | + | |
− | * rebuild draw pools
| + | |
− | | + | |
− | Seems just to remove dead pools from the list of pools.
| + | |
− | | + | |
− | * update sky
| + | |
− | | + | |
− | Redraws skytexture and cubic environment map.
| + | |
− | | + | |
− | '''draw geometry'''
| + | |
− | | + | |
− | * if render scene to texture (if vertex shaders supported) bind frame buffer to FBO
| + | |
− | | + | |
− | * render pipeline
| + | |
− | | + | |
− | unbind vertex buffers (?)
| + | |
− | | + | |
− | set safe default state values (matrices and stuff)
| + | |
− | | + | |
− | set fog and lights
| + | |
− | | + | |
− | render drawpools
| + | |
− | | + | |
− | Drawpools represent either a set of polygons (LLFacePool) or a renderpass (LLRenderPass). There are different types of either kind.
| + | |
− | | + | |
− | ''Facepools'' are grouped in Terrain, Ground, Tree, Avatar, Water, Sky and WLSky. There maybe multiple facepools of each type (one per spatial partition?).
| + | |
− | | + | |
− | ''Renderpasses'' can be Simple, Alpha, Glow, Invisible or Bump passes. There is one instance of each renderpass draw pool.
| + | |
− | | + | |
− | for each drawpool:
| + | |
− | | + | |
− | - set up vertex buffer and texture
| + | |
− | | + | |
− | - render faces to vertex buffer
| + | |
− | | + | |
− | - render vertex buffer to frame buffer (?)
| + | |
| | | |
− | Source is from http://wiki.secondlife.com/wiki/Rendering_System
| + | The OSviewer uses Unreal Engine to render its awesomness |
| [[Category:OSviewer]] | | [[Category:OSviewer]] |