From 9f686a28b7d8e6c3d9e883d7899ac4be97bc57e9 Mon Sep 17 00:00:00 2001 From: RDW Date: Fri, 1 Mar 2024 06:39:30 +0100 Subject: [PATCH] Docs: Add a description of the client's lighting model Some parts need more research, but it's good enough for a first draft. --- docs/rendering/color-banding-example.png | Bin 0 -> 65560 bytes .../posterized-lightmaps-closeup.png | Bin 0 -> 2652 bytes docs/rendering/scene-lighting.md | 230 ++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 docs/rendering/color-banding-example.png create mode 100644 docs/rendering/posterized-lightmaps-closeup.png create mode 100644 docs/rendering/scene-lighting.md diff --git a/docs/rendering/color-banding-example.png b/docs/rendering/color-banding-example.png new file mode 100644 index 0000000000000000000000000000000000000000..c6036cf5560249ab90d5570c050be82c35a72032 GIT binary patch literal 65560 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

DotJu;qrtdTI)IGj*} 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 literal 0 HcmV?d00001 diff --git a/docs/rendering/posterized-lightmaps-closeup.png b/docs/rendering/posterized-lightmaps-closeup.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8eb15afcf08c48ce4910b7152c25f8c7917d55 GIT binary patch literal 2652 zcmb7`X;4#F6vtmsM3z9oDLW;tgPBUiEPxOKk+KK{Q7c;41kkXIECHgjCMcFxL6{DM zi2|XcPVH3L)Dkg5zyOW}lR;Dv0wD$rwX%eVW+ktoGj;mK%KLEV&iv=TbIr)AK9_|%gq zd>|^4mW0A%@xCaWFVWABNWi1Ku{bRD&RdSB={pNX^v(#288Z*$Ho{|8hr3C#q(>dh z1psS@m4$dZ&NP_BwJD)HLjj<*%G!`bnQL$^Gv zyEN$#fA-sZ9bkro6yZ7@xi#=Q7tJ!eHT;Eb^mH#uv$$MURh3mIo^7U{E@o2H6oo^X z1fruQ-QdEsLQy>Ll`dZ#Zsr>e25I3%%yA7x%DQT7RqGHXLr-0R?GY&e@OeD~h@W5@ zym+DkUcQ%5;FyX=OqPQ-z%N$`K*w4SM zvF#67d^?p^b6P&7*s9lf1@-oCZbpsm!0ntIG91)yS$9 zlY)Cno*VJp7Np6R-udQ~JzHBF=q@KMBVQ}ufh21Z&W%G=EP7VMu`4ko$HbEBJ>82g zw7!Z7cuafNH+FoZAa-781?n2GR{HfrcZU~Tv&4=P;j=iR|i%acsV0TBBoh}Tx`tm^begYI5 zM}9AyPk0|l4p_ZM2C-DNWxzIj?on(O-F{bVPu!GKn$7Z16KEq59$X^u^-jtpY#=Ka zhJ&4Iv$pptRW@YZG<>3C-I_XW4PwBqR`z?h=rq6G4O;99hqTe}_56w^upqc=UwVRu zB$Y)gSJf*kxv1fFI05Jsx=Og%NEF_B>qly-HWvRtxO~4BMwwq%hMiyJ+Sr4M_>(T4=~Nkk&lw#aDIz4!=+HH{d}X zq;q{zaw^A)D_kUz`^X}zU9&UEjV*n-94VX%vTK8k+WhfC%VTZ>Axr`1F~4Roj!Z|} z((l-|^avaS4^2OxRI%KcA()l<;%C#@`)*7*;naRkt(H?{dNUYNo9+s^`!HY}Syc2u z2AvJFNoBbR6GyhHMtpF86_kpkg$UXHmv4&f_X_V)MX9#SMZQ2G$DuS2jK#kN5rb_9?)hObTh>sg7McWrxB=S$xtE6HnR9fzjsdN3q*SRx&2Vo zc++r4bG9X0t?ppAtd$7aNbZkven+pbanQ4TxSdrAW426Z%$uiYmbNQ|UKO1QrJ;9t zD!Y73c3ABB`Fz(-jLH|&vfgxqx$$0JzoG@C!FVhlOqd>vvI5B{%N%eQzF{R9Ht-Y= Ww_IFPDKh=e0nrh0;Z5Hpoc$Z6;~`rB literal 0 HcmV?d00001 diff --git a/docs/rendering/scene-lighting.md b/docs/rendering/scene-lighting.md new file mode 100644 index 00000000..69292491 --- /dev/null +++ b/docs/rendering/scene-lighting.md @@ -0,0 +1,230 @@ +--- +sidebar_position: 300 +slug: /rendering/scene-lighting +title: Scene Lighting +--- + +This document describes the lighting model used by the Ragnarok Online client. + +## Overview + +Several inputs contribute to the final color sent to the display device: + +- The geometry itself defines the initial [vertex color](https://gamedev.stackexchange.com/questions/139059/what-is-a-vertex-color) for each textured surface, as well as a [vertex normal](https://en.wikipedia.org/wiki/Vertex_normal) +- One global [ambient light source](https://en.wikipedia.org/wiki/Shading#Ambient_lighting) can be configured, which controls the general "brightness" level of the scene +- A single [directional light source](https://en.wikipedia.org/wiki/Shading#Directional_lighting) is always present; it can be thought of as "the sun", casting shadows onto the map +- [Diffuse textures](https://en.wikipedia.org/wiki/Texture_mapping) (also known as color maps) add detail to the geometry, or even 2D objects like sprites and effects +- Dynamic light sources, here stored in precomputed [lightmap textures](https://en.wikipedia.org/wiki/Lightmap), additionally contribute to the lighting +- If enabled, the engine's [vertex fog effect](https://learn.microsoft.com/en-us/windows/win32/direct3d9/vertex-fog#range-based-fog) will be used to apply color-grading according to the fog parameters + +The following sections explain how an accurate rendition of the game world can be produced from all of the above. + +## Pipeline Stages + +Not all objects in the world are affected by light equally. This can be expressed in terms of [fixed-function pipeline](https://en.wikipedia.org/wiki/Fixed-function) stages: + +| Object Type | Lighting | Diffuse Texture Blending | Lightmap Texture Blending | Vertex Fog | Alpha Blending | +| :---------: | :------: | :----------------------: | :-----------------------: | :--------: | :------------: | +| Ground | YES | YES | YES | YES | NO | +| Water | NO | YES | NO | YES | YES | + +The list is currently incomplete; more research is needed on the remaining object types. Some educated guesses: + +- Models: Diffuse, lighting, vertex fog, alpha blend stages are enabled - lightmap contribution is TBD +- Sprites: Diffuse, vertex fog, alpha blend stages are likely enabled - lightmap contribution is TBD +- UI widgets: Diffuse, alpha blend stages are likely enabled - everything else is probably disabled + +There may be other game objects that use different settings, but these should be the most important ones. + +## Input Variables + +The operations performed as part of a given pipeline stage may depend on various inputs: + +- The base color is always interpolated from the fragment's vertex color and defaults to black, i.e., `rgb(0, 0, 0)` +- To increase the vibrancy of colors, both ambient and directional light colors must be [screen blended](https://en.wikipedia.org/wiki/Blend_modes#Screen) with the base color +- Next, the total light contribution can be computed using the directional and ambient light's setting and the vertex normal +- Diffuse textures are modulated (multiplied) with the result of the previous stage, presumably while ignoring alpha? +- The alpha channel of the lightmap texture ("shadowmap") is first modulated with the result of the previous stage +- Afterwards, the RGB channel of the lightmap texture ("color map") is added on top of this result, and possibly clamped? +- Vertex fog contributes its color based on the distance from the vertex to the camera's viewpoint, linearly interpolated +- Finally, the generated fragment may be layered on top (via [alpha compositing](https://en.wikipedia.org/wiki/Alpha_compositing)) in accordance with the selected blend mode + +How those operations are implemented depends on the graphics API. DirectX7 uses [render states](https://learn.microsoft.com/en-us/windows/win32/direct3d9/render-states) and [blending stages](https://learn.microsoft.com/en-us/windows/win32/direct3d9/creating-blending-stages). + +## Lighting Stage + +Computes the lit base color, corrected for [underexposure](https://www.adobe.com/creativecloud/photography/hub/guides/underexposure-vs-overexposure-photography.html) that's being introduced due to working in the wrong color space. + +Inputs: + +- Directional light settings from the map's [RSW](/file-formats/rsw) file +- Ambient light settings from the map's [RSW](/file-formats/rsw) file +- Vertex color and surface normals derived from the [GND](/file-formats/gnd), [RSM](/file-formats/rsm), or [GR2](/file-formats/gr2) file + +Operations: + +1. Compute sunlight contribution from the directional light settings +1. Add ambient light contribution from the ambient light settings +1. Clamp result to the unit range (in order to avoid overexposure) +1. Compute contrast correction color using [Screen](https://affinityspotlight.com/article/blend-modes-explained/) blending +1. Modulate the previous result with the contrast correction color + +Specular highlights are disabled and needn't be added. + +### Directional Light + +The ray direction of the sun can be calculated from its world position, stored as [spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system) in the [RSW](/file-formats/rsw) file: + +```lua +function RagnarokRSW:ComputeSunRayDirection(latitudeInDegrees, longitudeInDegrees) + local sunRayDirection = Vector3D(0, -1, 0) + + local rotationAroundX = Matrix3D:CreateAxisRotationX(-latitudeInDegrees) -- Account for inverted Y + local rotationAroundY = Matrix3D:CreateAxisRotationY(longitudeInDegrees) + + sunRayDirection:Transform(rotationAroundX) + sunRayDirection:Transform(rotationAroundY) + + return sunRayDirection +end +``` + +_Source: Example implementation taken from the [RagLite SDK](https://github.com/RagnarokResearchLab/RagLite/blob/0bc2856e2acebcbb568b095853180574a78dc4ba/Core/FileFormats/RagnarokRSW.lua#L246-L256) (based on previous work by [Borf](https://github.com/Borf) and [FlavioJS](https://github.com/flaviojs/))_ + +### Ambient Light + +If lightmaps are disabled, the ambient scene lighting is amplified by a factor of 50% (multiply color components by 1.5). + +This serves as an optional "brightness correction" step that only takes place when lightmaps are disabled on load. + +### Dynamic Lights + +The [RSW](/file-formats/rsw) file of each map contains definitions for the dynamic light sources in the scene. However, they aren't rendered by the client in real time. Instead, the game uses pre-computed [lightmap](https://en.wikipedia.org/wiki/Lightmap) textures which can be blended with the terrain geometry more efficiently at runtime. Since the lights don't directly contribute to the scene lighting, I won't discuss them in detail here. + +If you're interested in how they can be used for dynamic lighting, you should check out [Doddler's explanation on YouTube](https://youtu.be/VKywJ0QtcFE?t=561). + +### Contrast Correction + +When rendering the scene with just the ambient and directional light sources contributing alongside the diffuse or lightmap textures, the resulting image is severly underexposed. This is likely because lighting computations were performed in the wrong color space, prompting the developers to layer a composite blending effect on top to make the colors more vibrant. + +For more information, see the [Wikipedia article on blend modes](https://en.wikipedia.org/wiki/Blend_modes), in particular the section about composite [screen blending](https://en.wikipedia.org/wiki/Blend_modes#Screen). + +### Object Lighting + +Scene objects (i.e., RSM model instances) may receive additional lighting when lightmap textures are enabled. The client includes a file called `mapobjlighttable.txt` that looks like it would be used to control this behavior. However, this mechanism seems to be broken or unused. More research is needed to determine how objects should be lit when the feature is enabled. + +Examples: According to said table, object lighting is **enabled** for`orcsdun01` and `orcsdun02`, but **disabled** for `gef_dun0`. + +## Texture Blending Stages + +Projects textures onto the lit geometry (as computed during the lighting stage) in order to cheaply add more detail. + +### Diffuse Textures + +Diffuse textures don't use the alpha channel directly, but rather adopt a convention where magenta becomes transparent: + +```rust +fn isTransparentBackgroundPixel(diffuseTextureColor : vec4f) -> bool { + return (diffuseTextureColor.r >= 254.0/255.0 + && diffuseTextureColor.g <= 3.0/255.0 + && diffuseTextureColor.b >= 254.0/255.0); +} +``` + +_Example: A method to determine which background pixels to discard based on the RGBA value (originally proposed by [curiosity](https://github.com/curio-r))_ + +This enables the use of simple 256 color bitmaps (stored in [BMP files](https://en.wikipedia.org/wiki/BMP_file_format)) for mostly every texture, at the cost of flexibility. + +Additionally, texture images are degraded by what appears to be a reduction in [color depth](https://en.wikipedia.org/wiki/Color_depth) to 16 bits per pixel: + +![color-banding-example.png](color-banding-example.png) + +_Pictured: The use of a smooth gradient demonstrates how textures are rendered with fewer colors inside the game_ + +This quantization step is the cause of [color banding](https://en.wikipedia.org/wiki/Colour_banding), which explains the [posterization](https://en.wikipedia.org/wiki/Posterization) effect that can be observed on lightmaps. + +### Lightmap Textures + +Lightmap textures affect only the terrain ([ground mesh](/rendering/ground-mesh)) directly. Scene decorations may be lit separately (see [Object Lighting](#object-lighting)). + +Said alpha channel encodes the [ambient occlusion](https://en.wikipedia.org/wiki/Ambient_occlusion) percentage, while the RGB channel encodes the light contribution of the [dynamic light sources](#dynamic-lights) that were used to bake the lightmap texture. Colors lose even more precision due to the alpha channel: + +![posterized-lightmaps-closeup.png](posterized-lightmaps-closeup.png) + +_Pictured: The banding effect introduced by downsampling lightmaps to 4 bits per channel can immediately be spotted_ + +Each lightmap texture slices include a buffer area (1 pixel wide) that's designed to soften the impact of [texture bleeding](https://gamedev.stackexchange.com/questions/111704/getting-rid-of-texture-bleeding). + +## Vertex Fogging Stage + +Adds a basic color grading effect to any scene that uses the effect - if there's no fog this is effectively a NOOP. + +### Fog Parameters + +The GRF archive includes a list of [fog parameters](https://learn.microsoft.com/en-us/windows/win32/direct3d9/fog-parameters) (`fogParameterTable.txt`), which controls the [range-based vertex fog effect](https://learn.microsoft.com/en-us/windows/win32/direct3d9/vertex-fog#range-based-fog). + +This database contains one entry for each map that should use the fog effect. All entries have the following format: + +```txt +map_id# +nearLimitPercentage# +farLimitPercentage# +fogColorARGB# +unusedDensityPercentage# +``` + +As an example, consider the fog settings for Payon Cave F0 (`pay_dun00`): + +```txt +pay_dun00.rsw# +0.1# +0.9# +0xff04009A# +0.3# +``` + +This tells the DirectX engine to apply a vertex fog effect using color `rgb(4, 0, 154)` ([alpha is ignored](https://learn.microsoft.com/en-us/windows/win32/direct3d9/fog-color)) that reaches its highest density level at a distance of `1490 * 0.9 = 1341` world units (`268.2` if normalized) and is the least dense at a distance of `1490 * 0.1 = 149` world units (`29.8` if normalized), where the size of the imagined "fog sphere" is determined by the delta between the camera's near and far planes: `farPlaneDistance - nearPlaneDistance` resulting in `1500 - 10 = 1490` - see [Camera Controls](/rendering/camera-controls/#perspective-projection). + +The density parameter is completely ignored as it's used for [exponential mode](https://learn.microsoft.com/en-us/windows/win32/direct3d9/fog-formulas#exponential-fog), but the game only uses [linear fog.](https://learn.microsoft.com/en-us/windows/win32/direct3d9/fog-formulas#linear-fog). + +## Alpha Composition Stage + +Whenever transparency effects are used, this is the stage that actually computes the result. + +### Blending Equations + +Alpha blending may be performed to render translucent objects on top of the existing scenery (i.e., the game world). This process is highly specific to the type of object being rendered, but much more research is needed to cover the various 2D effects, sprites, etc. So far only the method for rendering water surfaces can be stated here with a high degree of certainty: + +- General blend formula: `RGBAsrc × RGBAsrcFactor + RGBAdst × RGBAdstFactor` (using [WebGPU](https://gpuweb.github.io/gpuweb/#blend-state) terminology) +- Color components: `RGBAsrc × SrcAlpha + RGBAdst × OneMinusSrcAlpha` +- Alpha component: `RGBAsrc × One + RGBAdst × OneMinusSrcAlpha` + +Perhaps unsurprisingly, this is the standard **A over B** operator described in the [Wikipedia article on alpha compositing](https://en.wikipedia.org/wiki/Alpha_compositing). + +### Supported Blend Modes + +The following table contains the blend parameters for all blend modes that have been verified so far: + +| Object Type | Component | Source Factor | Destination Factor | Blend Operation | +| :---------: | :-------: | :-----------: | :----------------: | :-------------: | +| Water Plane | Color | `SrcAlpha` | `OneMinusSrcAlpha` | `Add` | +| Water Plane | Alpha | `One` | `OneMinusSrcAlpha` | `Add` | + +Here, `Source` is the object to be blended (e.g., the water surface) and `Destination` refers to the existing frame buffer contents. + +## A Note on Color Spaces + +Lighting computations are usually performed on linear colors, even if most output devices expect the result in [sRGB](https://en.wikipedia.org/wiki/SRGB) format. + +Since textures generally store colors in sRGB format, they need to be gamma-decompressed before use as the result will otherwise be a severely underexposed image. Afterwards, colors would then be sRGB-encoded again before the device can actually display them. This step is called [gamma correction](https://en.wikipedia.org/wiki/Gamma_correction) and intended to emulate the characteristics of [CRT monitors](https://en.wikipedia.org/wiki/Cathode-ray_tube). + +The RO client, however, doesn't seem to be doing any of this. Instead, the sRGB-encoded textures are seemingly used as-is. The lighting computations then fundamentally alter the appearance of the rendered scene by introducing underexposure into the final image, so that darker regions appear more intense. This is alleviated by the [tone mapping step](/rendering/scene-lighting#contrast-correction) added via screen blending. + +[This blog post](https://blog.johnnovak.net/2016/09/21/what-every-coder-should-know-about-gamma/) explains the issue in more detail. With the screen blending effect there's no need to perform gamma correction. + +## References + +- [OpenGL-specific tutorial that explains gamma correction](https://lettier.github.io/3d-game-shaders-for-beginners/gamma-correction.html) +- [Another OpenGL-based explanation of the gamma correction issue](https://learnopengl.com/Advanced-Lighting/Gamma-Correction) +- [Tutorial explaining the use of the Screen blend mode in Photoshop](https://www.photoshopessentials.com/photo-editing/layer-blend-modes/screen/) +- [Implementation of the lighting model - for terrain surfaces only - in WebGPU Shader Language (WGSL)](https://github.com/RagnarokResearchLab/RagLite/blob/0bc2856e2acebcbb568b095853180574a78dc4ba/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl#L138-L171)