Implement a simple water shader for HDR.
Largely created from the non-HDR WS3.0 water shader,
but only generating a fragment normal.
Notes:
- Water color is a constant in the shader, and set by eye
only.
- foam etc is not yet implemented.
- at very low altitudes the shader breaks down somewhat.
This commit implements instancing for scenery objects by introducing a
OBJECT_INSTANCED verb in stg files. Instances can be defined by their
positions, rotations and scales. The framework also supports extending
object instancing with custom effects, including an additional colorization
effect that allows for setting the colors for each instance of the same
model.
Detailed commit history can be found at [1], and mailing list discussions
at [2].
[1] https://sourceforge.net/u/fahimdalvi/fgdata/ci/feat/scenery-object-instancing/~/tree/
[2] https://sourceforge.net/p/flightgear/mailman/flightgear-devel/thread/7381A03F-BF5B-45E7-AAF3-5288B7DEDFFA%40gmail.com/#msg37617087
Squashed commit of the following:
commit 2af16b3dfa859eff8b9d96e1b9256e8d872d28c5
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Feb 24 10:24:12 2024 +0300
Update documentation for instancing
Add details on optional parameters and the order of transformations.
commit f0fda25c196fbb46063abdd30be63ebbc4285841
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Feb 24 10:15:17 2024 +0300
Add low-spec shaders for object instancing.
commit bcf6e15523750ea9d1578a48de736073a37ea2bd
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Fri Feb 16 14:54:26 2024 +0300
Add documentation
commit a4b889b40543f70c4e9c9d6002f853547c6fb373
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Tue Feb 13 17:32:11 2024 +0300
Use header file defined indices for vertex attributes
Vertex attributes were hardcoded across the code, this commit changes
the implementation to use constants defined in the header file. Also
change the indices used to be compatible with the future HDR pipeline.
commit 8120544e276161f57dd1aeda645ef52684eab7a7
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Feb 10 22:26:55 2024 +0300
Clean up shader code
Use *.glsl library code to minimize duplication across object-instancing*
shaders. Rename variables to follow Shader Style Guide:
https://wiki.flightgear.org/Shader_Style_Guide
commit ed864379621c060860c68d46cab054f8f1161f25
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Feb 3 22:23:11 2024 +0300
Remove unused fragment shader.
commit be80516fff660764dad245cd6389e7616d8d807c
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Feb 3 22:21:15 2024 +0300
Add support for multiple effects and add a colored instancing effect.
This commit adds shaders and a corresponding effect for colored
instanced objects using the new custom attributes provided by the
corresponding SimGear commit.
commit f758ad00b08578052b815bdf138dae5b3a0e026c
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Feb 3 16:31:15 2024 +0300
Remove unnecessary inclusion of vertex shader in inherited effect
commit 26fa5ecc8d825ed6902c6a6934a82749839cc9cc
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Wed Oct 18 21:14:18 2023 +0300
Fix rotation to match normal scenery objects
commit 2a47c3164085d5821944f53a02a55c3bea9ca4ac
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Wed Oct 18 21:13:41 2023 +0300
Reduce instancing effect to bare minimum
commit c24d4fdbfc295872ec6f47a8f8e002dfa301fd83
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Oct 14 11:30:34 2023 +0300
Properly handle model/texture/effects
Simgear:
Previously, the model was being loaded without any options, this is
now fixed. *ac models have their effect instantiated manually, while
*xml models require an explicit <effect> tags. Also, the already
loaded model node is edited (for adding vertex attributes, statesets
etc) instead of creating a new node (for deferred texture loading and
other stuff to work).
FGData:
Reverted object-instancing effect to match model-default more closely
to make texturing work.
commit 17e74fc4cc421c3aa9f08e5bbcd08d8a5b450655
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Sep 9 14:07:35 2023 +0300
Implement model-default effects for instanced objects.
Not perfect yet, normal models are quite a bit darker, and we are loading
the model using OSG directly, instead of SGModelLib.
commit d4734690745bde0652e578174e18ddf4fe799000
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Apr 23 14:52:36 2022 +0300
Implemented instance rotation and scaling
This commit adds support for optional per-instance rotation and
scaling, defaulting to no scaling and rotation if none is specified.
commit dd7256818becb21695487385fe5d4b7fcd33a61e
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Fri Mar 18 09:19:24 2022 +0300
Implemented texture handling
The code assumes there is a single texture, and this is applied
to the single drawable geometry created for instancing. This commit
breaks texture-less object support for instancing.
commit 547e051459c91ef0abe1b9fe583f0aed59720135
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Sat Feb 26 14:25:57 2022 +0300
Moved random color generation to shader
commit ab927a8555ca615d2fe51c9fc87b9fb5f6198c3f
Author: Fahim Imaduddin Dalvi <dalvifahim@gmail.com>
Date: Tue Feb 22 18:32:10 2022 +0300
Proof of Concept instancing support for scenery objects.
Previously we did not take into account the atmospheric transmittance
to render the stars, leading to stars being incorrectly rendered in
low visibility conditions.
Also place the stars in the correct render bin.
All transparency-related config has been reverted back to how it was in
2020.3 for maximum compatibility. This is not ideal for HDR but we will
figure something out.
In HDR, transparent AC objects must be marked with model-transparent or
model-combined-transparent. glTF objects are automatically assigned the
correct Effects.
- Terrain and clouds and now rendered on the envmap, with correct aerial
perspective.
- Each face is rendered on a separate frame to help with performance.
- All faces are updated every 1.5 minutes. This can be changed through a
property.
We also now pre-expose our lighting before writing to the HDR buffers.
This solves some precision issues and prevents the Sun from producing
infinite values.
- New atmosphering rendering technique based on my own work.
- Attempt to fix some remaining transparency issues.
- Use a luminance histogram for auto exposure.
- Add support for clustered shading.
- Add WS 2.0 shaders.
- Add 3D cloud shaders.
- Add orthoscenery support.
See related SimGear commit e8ffe461
Now the orthophoto texture coordinates are contained in gl_TexCoord[2],
so no need to pass any custom vertex attributes to Effects that use
photoscenery.
There are 3 relevant render bins for aircraft models:
- 0: default
- 10: depth sorted, automatically selected for transparent objects.
- 111: depth sorted, explicitly set by some transparent effects (hud, glass)
The model-default effect does not set <render-bin> on purpose, to allow
automatic selection of bin 0 or 10. So my second patch which added <render-bin>
to model-default is wrong.
It is only model-transparent which should explicitly set bin 111
to interact well with hud/glass effects.
Objects like OSM buildings using the `model-combined` effect ignored
the Terrain quality. Rayleigh Fog is computed for the terrain only
at "Ultra" level, but was computed for models at all quality levels,
which led to a visual disparity. The shader now takes into account
the terrain quality before computing rayleigh fog for objects.
The `road` effect also had the same issue and is fixed now.
model-combined-transparent was replaced by calling model-transparent causing the ALS
externel canopy effects to get lost. Call model-combined instead which restores these
effects.
Previously the water shader was separate and executed on a
different mesh.
This adds the water shader as a separate fragment function
(ws30-water.frag) and uses a material parameter passed in
as a Uniform to use it in preference to the usual texel
lookup.
Performance testing found a slight performance improvement
from having a single mesh, but a slight performance impact
from the extra fragment shader complexity.
from Chris RINGEVAL
https://sourceforge.net/p/flightgear/fgdata/merge-requests/269/
Squashed commit of the following:
commit 23194c0fed49609999b4da67b2990af774f7df03
Author: Chris Ringeval <eatdirt@protonmail.com>
Date: Sun Jan 30 23:52:09 2022 +0100
Remove CC-BY-SA 3.0 texture provided by EAS and replace it with one made by myself
commit cb30c7972ba3db6b4cb4ad5f9dcd12d7e0ddbc1a
Author: Chris Ringeval <eatdirt@protonmail.com>
Date: Sun Dec 5 15:49:31 2021 +0100
Optimize shaders for vram usage and use new uniforms
commit 7541e49c6757a23b08684f1c4354e84b9af3bcc3
Author: Chris Ringeval <eatdirt@protonmail.com>
Date: Thu Dec 2 17:22:55 2021 +0100
Reduce the oversized galaxy texture to 400kB
commit 0e6591907a9978077dc6dff1b53dea7c439a6cc4
Author: Chris Ringeval <eatdirt@protonmail.com>
Date: Tue Nov 30 23:49:24 2021 +0100
Add Milky Way onto the night sky
Previously haze calculations were performed
in the main body of the ws30 shaders (inherited
from the ALS terrain shaders). This change creates
a common applyHaze function to consistently apply haze.
This is not ws30 specific, and could be used to replace the
haze calculations of all ALS shaders for improved consistency.
Squashed commit of the following:
commit 115511888c20c53670eba17a82c81c9af99d7302
Author: vs <vs2009@mail.com>
Date: Mon Dec 6 18:52:06 2021 +1000
WS30 effects and shaders:
Changelog:
ws30-ALS-ultra.frag:
- Ground textures lookups use their own coordinates separate from the landclass texture lookup.
- Partial derivatives dFdx and Dfdy are packed together in a vec4, so simple multiplication to scale can be done in 1 instruction. dFdx = s and t components. dFdy = p and q components. These must be scaled properly for ground texture access as ground texture stretching and detiling of tex coords mean textures are scaled differently.
- Added calculation of partial derivatives for texture coordinates used by the 5 non- base textures. dFdx() and dFdy() were called for nontrivial texture coordinate manipulation.
- New control randomise_texture_lookups added at top of ws30-ALS-ultra.frag, in the development tools section. Setting this to 1 will do a stress test of ground texture array lookups. A fast random number generation function is used to assign each landclass 4 random textures from the ground texture array - this is done by . Performance will not be as bad in the full ALS port as some texture slots will better caching in memory - e.g. have 1 or a few variants.
- Possible optimisation: use a 2nd or 3rd texture array for some of the non-base texture slots that typically have 256, 512, or 1024 textures. The resolutions of these arrays should change based on the largest loaded texture size in the active regional definitions - this will allow taking full advantage of smaller texture sizes in some areas. The disadvantage is some texture duplication with more slots.
- Possible optimisation: offer the option to shrink textures by 50% or 25% - for texture slots that use large textures like base or mix slots.
- Very temporary - reduce procedural normal map features with photoscenery active without breaking profiling, as the inputs to shaders are effect defaults or placeholder (by request on ML).
----
ws30-ALS-ultra.vert:
- Start of conversion of geocentic world space xyz into lat/lon coords used for ground texture lookups. Currently commented out as it's unknown what model space coords are in (not geocentric it seems).
ws20-ALS-landclass-search-functions.frag:
- Add control for changing the ground texture array lookup function for debugging in case old compilers/GPUs have issues. tex_lookup_type: 0: normal( textureGrad(), 1: textureLod (manual Lod calculation), 2: texture() with no partial derivative adjustment.
- New get6_random_integers() will extract 6 limited random values from the full precision of a 32 bit random value.
- Old landclass_texel_size_m references are removed since textureSize() is used. There are no 'const in float' arguments that may cause issues on AMD compilers.
----
WS30-overlay effect (Inactive):
- ws30-overlay.eff (derived from terrain-overlay.eff). Technique no "4" is used for two passes. The 1st pass is a copy of the ALS ultra pass (technique no "5") from ws30.eff. The 2nd pass is the same as terrain-overlay.eff. The 2nd pass uses terrain- overlay.frag from WS2.
- grass-ALS.vert copied to ws30-ovelay-ALS.vert. To do: needs texture coords that don't change with tiles.
- terrain-overlay-ALS.geom copied to ws30-overlay-ALS.geom. To do: uses gl_PositionIn [i].xy for position in the horizontal plane - assumes z is vertical. Tile model space doesn't seem to match this.
- WS3 doesn't seem to have a way of switching references to terrain-overlay.eff (which inherits from terrain-default.eff) to the new ws3-overlay.eff (which needs to inherit from ws30.eff). The ws3-overlay.eff included /might/ just work without any other changes: the first pass is the WS3 als ultra settings pass, and the second overlay pass is unchanged from WS2 (the same terrain overlay shaders should probably work apart from texcoords and rawpos not being correct).
- Materials/base/materials-base.xml: ws30Road material: uncomment line declaring terrain-default as the effect. The target effect for ws30 roads is road-*.eff and it's added to ws30Road and ws30Freeway but commented out as it's not working currently.
- Misc: large scale transitions are turned on in ws30-ALS-landclass-search-functions.frag by default. Grow landclass borders with large scale transitions is now on by default.
----
Changes after the multi-texture support commit:
ws30-ALS-ultra.vert
- Added documentation: WS30 model space and z up space - for future people working on WS30, and people looking through shaders to rule out possibilities e.g. when fixing bugs, or interpreting visual bug reports.
ws30-ALS-landclass-search-functions.frag:
- For now, lookup_ground_texture_array() also looks up the relevant texture's index based on an integer.
- Add get_mixed_texel() - looks up texel for this fragment and any neighbors before mixing. Moves currently shared mixing code out of 3 fragment shaders.
Misc: changed indentation from mixed tabs/spaces to spaces in ws30-ALS-ultra frag and vert. The indentation can be changed again when the porting is complete.
ws30-ALS vert/frag and ws30-ALS-detailed vert/frag:
- Add varying for ground texture coordiante, currently set to gl_TexCoord[0]. Apply texture stretching dimensions in fragment shaders.
- Misc: varying rawPos is set to vec2 for now, as relPos.z+eye_alt might be faster. Misc: keep WS2 mixing logic for now , including turning off mixing via the alpha channel of the textures
----
Changes after sending material parameters in uniform arrays commit:
- Materials parameter for rock_strata is cast into an int so rock_strata==1 should work. Misc: Left over uniform for rock strata cleaned up.
- ws30-ALS-ultra.frag and ws30-ALS-detailed.frag: Add missing mat_shininess for photoscenery case .
commit 918aa4402143638133153dff722ef3a6b4feead7
Author: vs <vs2009@mail.com>
Date: Sat Nov 20 23:38:52 2021 +1000
ALS water effect & shaders:
Add object shadows for water in a similar fashion to terrain.
Add commented out code of what should be the shader part of clustered lighting for the compositor. getClusteredLightsContribution() normally multiplies the texel by light contributions. It is fed input such that the light contribution term is similar to secondary lights in the water lighting equation, and both are added together.