Darkplaces lighting/Lighting model

From Blood Wiki
(Difference between revisions)
Jump to: navigation, search
m (Shading)
m (Specular)
Line 79: Line 79:
 
  <font color=green>// Global.GlossExponent is controlled by r_shadow_glossexponent or r_shadow_glossexponent2 if gloss is forced</font>
 
  <font color=green>// Global.GlossExponent is controlled by r_shadow_glossexponent or r_shadow_glossexponent2 if gloss is forced</font>
 
  <font color=green>// Material.GlossExponentModis set by '''dpglossexponentmod''' material keyword</font>
 
  <font color=green>// Material.GlossExponentModis set by '''dpglossexponentmod''' material keyword</font>
  SpecularExponent = Texture.GlossMap.Alpha * Global.GlossExponent * Material.GlossExponentMod;
+
  if (Texture.GlossMap.Alpha)
 +
    SpecularExponent = Texture.GlossMap.Alpha * Global.GlossExponent * Material.GlossExponentMod;
 +
else
 +
    SpecularExponent = Global.GlossExponent * Material.GlossExponentMod;
 
  <font color=green>// this is rough specular calculation</font>
 
  <font color=green>// this is rough specular calculation</font>
 
  <font color=green>// optionally, engine can use real reflection map to get specular normal (see r_shadow_glossexact below)</font>
 
  <font color=green>// optionally, engine can use real reflection map to get specular normal (see r_shadow_glossexact below)</font>

Revision as of 14:08, 7 October 2012

Darkplaces lighting | previous chapter: Introduction

Contents

Lighting visualized. Blue is shadow volumes, bright orange is zones being processed for dynamic realtime lighting.

Darkplaces uses a variation of Phong shading as a default lighting model. It is based on per-pixel lighting - a technique of computing lighting equations for each pixel independently. Renderer contains lots of tricks to allow shading to be fast and flexible. Default model is used on both GL2.0 rendering paths and pre-shader rendering paths (GL1.4), although not all lighting features are possible on pre-shader fixed rendering pipeline.

Lighting are breaked into the passes:

  1. Base pass (lightmap/lightgrid/vertex lighting)
  2. Dynamic light 1
  3. Dynamic light 2
  4. ...
  5. Dynamic light X
  6. Photon Mapping (optional)
  7. Fog (optional)

Darkplaces lighting model involves this data to be used for each pixel illumination:

  • Vertex normal : values between vertices of pixel's triangle are interpolated by Gouraud shading
  • Color Map : base texture (best way to use diffuse texture)
  • Normal Map : texture storing additional surface curvature (optionally, alpha storing height)
  • Gloss Map : texture used for specular and containing gloss color (RGB) and exponent mod (alpha)
  • Glow Map : texture's local luminance texture, RGB additive blended texture that entirely ignores shading
  • Light Vector : vector of light direction (either calculated for realtime light or got from deluxemap lightmap component)
  • Eye Vector : being computed for each pixel, this vector is used for specular calculation.

This gallery illustrates how lighting features changes the quality:

Attenuation

Dynamic lights in Darkplaces engine are omnidirectional, using linear falloff.

 Spotlights and projected dynamic lights could be simulated with cubemap filters.

Static lights can have a variety of options for controlling attenuation (this options is only used in Q3map2 LIGHT stage):

  • target and radius : simulating spot lights with cone falloff
  • _sun flag - infinite distance lights, constant direction
  • _deviance and _samples - non-point lights

Shading

Shading is done by using dotproduct of light vector and pixel normal. Some ambient lighting could be added for a more smooth result.

Important: Lightmaps by default dont have shading since they lack light direction data. In order to make lightmaps to use whole shading cycle, map compiler tool should be configured to make deluxemaps (second lightmap set which store per-pixel light directions)

Rough shading algorithm explanation:

// Surface's vertex normals are always supplied, texture normalmap is forced to default RGB '0.5 0.5 1' (same as surface normal) if not found
PixelNormal = Surface.VertexNormal + Texture.NormalMap;
// LightSource are only defined for dynamic lights
// LightmapGlobal.AmbientLight is r_ambient cvar
// Material.AmbientLight is set by dprtlightambient material keyword and only applicable to dynamic lights
AmbientLight = LightSource.AmbientLight + LightmapGlobal.AmbientLight + Material.AmbientLight;
if (LightSource)
    DiffuseLight = LightSource.DiffuseLight;
else
    DiffuseLight = 1; // Static lighting
Shading = dotproduct(PixelNormal, LightVector) * DiffuseLight + AmbientLight;
 r_shadow_usenormalmap : Enables use of normalmap texture for lighting. Setting this to to will make only vertex normals to be used.
 r_shadow_bumpscale_basetexture : Forces normalmap to be automatically calculated from color texture by using it as bumpmap, value controls magnitude. Requires r_restart.
 r_shadow_bumpscale_bumpmap : Normalmap can be supplied as _bump texture, in this case engine converts it to normalmap on load, values is magnitude. Requires r_restart.
 r_glsl_deluxemapping : Use full shading on lightmapped surfaces. A value of 2 forces deluxemap shading even if surface have no one.
 r_ambient : Amount of ambient light to be added to all surfaces. Makes level brighter.

Specular

Specular are optional and could be tweaked per-material.

Specular offers two parameters to mess with:

  • Specular exponent : intensity of specular effect, this could be very high or very low. Basically its just a modifier to gloss texture.
  • Specular power : how 'sharp' gloss is, high values are used to make texture to be plastic-like, while lower ones are suitable for matte surfaces. Basically its just a modifier to gloss texture's alpha channel (which is forced to 1 if not supplied).

Gloss may be forced (see r_shadow_gloss 2 below), in this case texture, if missing its own gloss map, gets a white image for gloss map and parameters from a cvars.

Rough specular algorithm explanation:

// Global.GlossIntensity is controlled by r_shadow_glossintensity or r_shadow_glossintensity2 if gloss is forced
// Material.GlossIntensityMod is set by dpglossintensitymod material keyword
SpecularColor = Texture.GlossMap * Global.GlossIntensity * Material.GlossIntensityMod;
// Global.GlossExponent is controlled by r_shadow_glossexponent or r_shadow_glossexponent2 if gloss is forced
// Material.GlossExponentModis set by dpglossexponentmod material keyword
if (Texture.GlossMap.Alpha)
    SpecularExponent = Texture.GlossMap.Alpha * Global.GlossExponent * Material.GlossExponentMod;
else
    SpecularExponent = Global.GlossExponent * Material.GlossExponentMod;
// this is rough specular calculation
// optionally, engine can use real reflection map to get specular normal (see r_shadow_glossexact below)
SpecularNormal = PixelNormal + EyeVector;
Specular = SpecularColor * power(dotproduct(PixelNormal, SpecularNormal), SpecularExponent)
 r_shadow_glossintensity : Global intensity for specular calculations, default is 1.
 r_shadow_gloss2intensity : Global intensity for specular calculations applied for forced-gloss surfaces, default is 1.
 r_shadow_glossexponent : Global gloss exponent used as a base in shader calculations.
 r_shadow_gloss2exponent : Same one used for forced-gloss surfaces.
 r_shadow_glossexact : Use real reflection math for gloss calculation. This is slower and little more correct.

Shadows

Shadows are most valuable part of realtime lighting. They are increasing scene depth so it looks more realistic.

Important: Shadows are quite complex render task, many lights casting many shadows may decrease rendering speed significantly. Map designer should plan his map with this limitation in mind - there should be no situation of many lights being seen from a certain point, or user will experience a game slowdown.

Darkplaces supports two realtime shadowing techniques.

Stencil shadows

Stencil shadow volumes is a base shadow rendering method in Darkplaces.

This technique is well known for it's shadows not having penumbra. Many other restrictions (high fillrate hit, bad scalability) make this method to be used only on a few games (such as Doom 3).

 r_shadow_polygonfactor : how much to enlarge shadow volume polygons when rendering (should be 0!)
 r_shadow_polygonoffset : how much to push shadow volumes into the distance when rendering, to reduce chances of zfighting artifacts (should not be less than 0)
 r_shadow_frontsidecasting : whether to cast shadows from illuminated triangles (front side of model) or unlit triangles (back side of model)
 r_showshadows : Show areas covered by shadow volumes. Useful for finding out why some areas of the map render slowly (bright blue = lots of passes, slow). Only matters if using shadow volumes.

Shadowmapping

Since 2010 shadow mapping was implemented by Eihrul.

Shadowmapping have a number of advantages over shadow volume rendering and is considered to replace it:

  • Penumbra
  • Fast to render (especially on complex area maps)
  • Takes less CPU time (as construction of shadow volumes is not required)
  • Distance-based LOD (far lights rendered with lower shadowmap resolution)
  • Shadow edges are not sharp

Photonmapping

Stub!

Other light models

Darkplaces includes other lighting models which are used eventually:

Fake light

A developer-only mode which is forced on non-lit maps (ones which was compiled and didnt get LIGHT phase). This is infinite realtime light that is cast from eye position.

Cel shading

Altered shading for default lighting model.

Lightmap

Lightmap with no deluxemap applied (just an old lightmap with no per-pixel lighting effects)

Fullbright

No lighting applied (all textures at their full brightness)



Next chapter: Special effects
Back to index | Top of the page

Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox