Editing Darkplaces lighting/Lighting model

Jump to: navigation, search

Warning: You are not logged in.

Your IP address will be recorded in this page's edit history.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 4: Line 4:
  
 
Lighting are breaked into the passes:
 
Lighting are breaked into the passes:
# Static lighting (lightmap or lightgrid or vertex lighting)
+
# Base pass (lightmap/lightgrid/vertex lighting)
 
# Dynamic light 1
 
# Dynamic light 1
 
# Dynamic light 2
 
# Dynamic light 2
Line 12: Line 12:
 
# Fog (optional)
 
# Fog (optional)
  
Data used for each light pass:
+
Basically Darkplaces lighting model involves this data to be processed for each pixel:
* Vertex normal : values between vertices of pixel's triangle are interpolated using [http://en.wikipedia.org/wiki/Gouraud_shading Gouraud shading]
+
* Vertex normal : values between vertices of pixel's triangle are interpolated by [http://en.wikipedia.org/wiki/Gouraud_shading Gouraud shading]
 
* Color Map : base texture (best way to use [[diffuse]] texture)
 
* Color Map : base texture (best way to use [[diffuse]] texture)
 
* Normal Map : texture storing additional surface curvature (optionally, alpha storing height)
 
* Normal Map : texture storing additional surface curvature (optionally, alpha storing height)
* Gloss Map : texture used for specular reflection. Contains gloss color (RGB) and optional exponent multiplier (alpha)
+
* Gloss Map : texture is 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
 
* 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)
 
* 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.
 
* Eye Vector : being computed for each pixel, this vector is used for specular calculation.
 
This gallery illustrates how lighting features changes the quality:
 
<gallery>
 
File:Darkplaces lightexample flat.jpg|Attenuation-only 'flat' lighting
 
File:Darkplaces lightexample shadows.jpg|+ Shadows
 
File:Darkplaces lightexample shading.jpg|+ Shading
 
File:Darkplaces lightexample specular.jpg|+ Specular
 
File:Darkplaces lightexample bouncegrid.jpg|+ Photonmapping
 
</gallery>
 
  
 
==Attenuation==
 
==Attenuation==
Line 35: Line 26:
 
{{design|Spotlights and projected dynamic lights could be simulated with cubemap filters.}}
 
{{design|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):
+
Static lights that is used for lightmap calculations are opposite. They 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
 
* target and radius : simulating spot lights with cone falloff
 
* _sun flag - infinite distance lights, constant direction
 
* _sun flag - infinite distance lights, constant direction
Line 46: Line 37:
  
 
Rough shading algorithm explanation:
 
Rough shading algorithm explanation:
  <font color=green>// 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</font>
+
  <font color=green>// Surface's vertex normals are always supplied, texture normalmap is forced to default RGB '128 128 255' if not found</font>
 
  PixelNormal = Surface.VertexNormal + Texture.NormalMap;
 
  PixelNormal = Surface.VertexNormal + Texture.NormalMap;
 
  <font color=green>// LightSource are only defined for dynamic lights</font>
 
  <font color=green>// LightSource are only defined for dynamic lights</font>
 
  <font color=green>// LightmapGlobal.AmbientLight is r_ambient cvar</font>
 
  <font color=green>// LightmapGlobal.AmbientLight is r_ambient cvar</font>
  <font color=green>// Material.AmbientLight is set by '''dprtlightambient''' material keyword and only applicable to dynamic lights</font>
+
  <font color=green>// Material.AmbientLight is set by '''dprtlightambient''' matrial keyword and only applicable to dynamic lights</font>
 
  AmbientLight = LightSource.AmbientLight + LightmapGlobal.AmbientLight + Material.AmbientLight;
 
  AmbientLight = LightSource.AmbientLight + LightmapGlobal.AmbientLight + Material.AmbientLight;
  if (LightSource)
+
  <font color=green>// Since LightSource are only defined for dynamic lights, for all static lighting it defaults to 1</font>
    DiffuseLight = LightSource.DiffuseLight;
+
DiffuseLight = LightSource.DiffuseLight;
else
+
  Shading = dotproduct(PixelNormal, LightVector) * DiffuseLight + AmbientLightAmount;
    DiffuseLight = 1; <font color=green>// Static lighting</font>
+
  Shading = dotproduct(PixelNormal, LightVector) * DiffuseLight + AmbientLight;
+
  
 
{{cvar|r_shadow_usenormalmap|Enables use of normalmap texture for lighting. Setting this to to will make only vertex normals to be used.}}
 
{{cvar|r_shadow_usenormalmap|Enables use of normalmap texture for lighting. Setting this to to will make only vertex normals to be used.}}
Line 64: Line 53:
 
{{cvar|r_ambient|Amount of ambient light to be added to all surfaces. Makes level brighter.}}
 
{{cvar|r_ambient|Amount of ambient light to be added to all surfaces. Makes level brighter.}}
  
{{grammar}}
 
 
==Specular==
 
==Specular==
Specular (or gloss) is the mirror-like reflection of light from a surface, in which light from a single incoming direction (a ray) is reflected into a single outgoing direction. Many well-known surfaces (metal, plastic, wood) is recognized by specularity they have.
+
Specular are optional and could be tweaked per-material.  
  
 
Specular offers two parameters to mess with:
 
Specular offers two parameters to mess with:
* Specular multiplier: intensity of specular effect, this could be very high or very low. It is multiplier to gloss texture.
+
* Specular exponent : intensity of specular effect, this could be very high or very low. Basically its just a modifier to gloss texture.
* Specular exponent: 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).
+
* 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.
 
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.
Line 80: Line 68:
 
  <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>
  if (Texture.GlossMap.Alpha)
+
  SpecularExponent = Texture.GlossMap.Alpha * Global.GlossExponent * Material.GlossExponentMod;
    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>
 
  SpecularNormal = PixelNormal + EyeVector;
 
  SpecularNormal = PixelNormal + EyeVector;
 
  Specular = SpecularColor * power(dotproduct(PixelNormal, SpecularNormal), SpecularExponent)
 
  Specular = SpecularColor * power(dotproduct(PixelNormal, SpecularNormal), SpecularExponent)
{{important|Forced gloss (gloss 2) which is used if texture's gloss map is missed, are only used on outside map to simulate wet surfaces effect.}}
 
  
 
{{cvar|r_shadow_glossintensity|Global intensity for specular calculations, default is 1.}}
 
{{cvar|r_shadow_glossintensity|Global intensity for specular calculations, default is 1.}}
Line 97: Line 81:
  
 
==Shadows==
 
==Shadows==
Shadows are most valuable part of realtime lighting. They are increasing scene depth so it looks more realistic.  
+
Shadows are most valuable part of realtime lighting. They are increasing scene depth so it looks more realistic. Like with materials, power has a price: shadows are quite complex render task, many lights casting many shadows may decrease rendering speed significantly.  
  
{{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.}}
+
{{important|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 shadow volumes and shadow mapping.
+
Darkplaces supports two realtime shadowing techniques.
  
===Stencil shadow volumes===
+
===Stencil shadows===
 
[http://en.wikipedia.org/wiki/Shadow_volume Stencil shadow volumes] is a base shadow rendering method in Darkplaces.  
 
[http://en.wikipedia.org/wiki/Shadow_volume Stencil shadow volumes] is a base shadow rendering method in Darkplaces.  
  
Line 113: Line 97:
 
{{cvar|r_showshadows|Show areas covered by shadow volumes. Useful for finding out why some areas of the map render slowly <nowiki>(bright blue = lots of passes, slow)</nowiki>. Only matters if using shadow volumes.}}
 
{{cvar|r_showshadows|Show areas covered by shadow volumes. Useful for finding out why some areas of the map render slowly <nowiki>(bright blue = lots of passes, slow)</nowiki>. Only matters if using shadow volumes.}}
  
===Shadow mapping===
+
===Shadowmapping===
In 2010 darkplaces got [http://en.wikipedia.org/wiki/Shadow_mapping shadow mapping] implemented by [http://sauerbraten.org/ Eihrul].  
+
Since 2010 [http://en.wikipedia.org/wiki/Shadow_mapping shadow mapping] was implemented by [http://sauerbraten.org/ Eihrul].  
  
 
Shadowmapping have a number of advantages over shadow volume rendering and is considered to replace it:
 
Shadowmapping have a number of advantages over shadow volume rendering and is considered to replace it:
Line 121: Line 105:
 
* Takes less CPU time (as construction of shadow volumes is not required)
 
* Takes less CPU time (as construction of shadow volumes is not required)
 
* Distance-based LOD (far lights rendered with lower shadowmap resolution)
 
* Distance-based LOD (far lights rendered with lower shadowmap resolution)
 +
* Shadow edges are not sharp
  
 
{{hidden begin|Console variables}}
 
{{hidden begin|Console variables}}
{{cvar|r_shadow_shadowmapping|Enables shadow mapping}}
+
{{cvar|r_shadow_shadowmapping|Enables shadowmapping}}
 
{{cvar|r_shadow_shadowmapping|Shadowmap [[bias]] parameter (this is multiplied by nearclip * 1024 / lodsize}}
 
{{cvar|r_shadow_shadowmapping|Shadowmap [[bias]] parameter (this is multiplied by nearclip * 1024 / lodsize}}
 
{{cvar|r_shadow_shadowmapping_bordersize|Shadowmap size bias for filtering}}
 
{{cvar|r_shadow_shadowmapping_bordersize|Shadowmap size bias for filtering}}
Line 131: Line 116:
 
{{cvar|r_shadow_shadowmapping_minsize|Shadowmap size limit}}
 
{{cvar|r_shadow_shadowmapping_minsize|Shadowmap size limit}}
 
{{cvar|r_shadow_shadowmapping_nearclip|Shadowmap near clip in world units. Increasing this will make shadow rendering to be more precise (as more bits goes to middle range), at the cost of the small non-shadowed zone around light}}
 
{{cvar|r_shadow_shadowmapping_nearclip|Shadowmap near clip in world units. Increasing this will make shadow rendering to be more precise (as more bits goes to middle range), at the cost of the small non-shadowed zone around light}}
{{cvar|r_shadow_shadowmapping_polygonfactor|Slope-dependent shadow mapping bias}}
+
{{cvar|r_shadow_shadowmapping_polygonfactor|Slope-dependent shadowmapping bias}}
{{cvar|r_shadow_shadowmapping_polygonoffset|Constant shadow mapping bias}}
+
{{cvar|r_shadow_shadowmapping_polygonoffset|Constant shadowmapping bias}}
 
{{cvar|r_shadow_shadowmapping_precision|Makes shadowmaps have a maximum resolution of this number of pixels per light source radius unit such that, for example, at precision 0.5 a light with radius 200 will have a maximum resolution of 100 pixels}}
 
{{cvar|r_shadow_shadowmapping_precision|Makes shadowmaps have a maximum resolution of this number of pixels per light source radius unit such that, for example, at precision 0.5 a light with radius 200 will have a maximum resolution of 100 pixels}}
 
{{cvar|r_shadow_shadowmapping_useshadowsampler|whether to use sampler2DShadow if available}}
 
{{cvar|r_shadow_shadowmapping_useshadowsampler|whether to use sampler2DShadow if available}}
Line 145: Line 130:
 
'''Fake light'''
 
'''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.
 
: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.
'''Sun light'''
 
:A similar to fake light technique to render sun lighting on outdoor surfaces, Used for sunset and sun dawn effects on outdoor maps.
 
 
'''Cel shading'''
 
'''Cel shading'''
 
:Altered shading for default lighting model.
 
:Altered shading for default lighting model.
:{{cvar|r_celshading|Enable cel shading (alternate diffuse math)}}
 
 
'''Lightmap'''
 
'''Lightmap'''
 
:Lightmap with no deluxemap applied (just an old lightmap with no per-pixel lighting effects)
 
:Lightmap with no deluxemap applied (just an old lightmap with no per-pixel lighting effects)
Line 155: Line 137:
 
:No lighting applied (all textures at their full brightness)
 
:No lighting applied (all textures at their full brightness)
  
{{navigation footer|Special effects}}
+
{{navigation footer|Lighting methods}}
{{finished}}
+

Please note that all contributions to Blood Wiki are considered to be released under the Creative Commons Attribution Share Alike (see BloodWiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

Cancel | Editing help (opens in new window)

This page is a member of 2 hidden categories:

Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox