1
0
Fork 0

Volumetric grass effect for ALS utilizing a geomerty shader, based on work by Fernando Garcia Linan

This commit is contained in:
Thorsten Renk 2017-05-24 15:16:30 +03:00
parent 4e75be8d86
commit 8f7ab7e725
7 changed files with 1057 additions and 95 deletions

825
Effects/grass.eff Executable file
View file

@ -0,0 +1,825 @@
<?xml version="1.0" encoding="utf-8"?>
<PropertyList>
<name>Effects/grass</name>
<inherits-from>Effects/airfield</inherits-from>
<parameters>
<!--<texture n="13">
<image>Textures/Terrain/airport_grass2.png</image>
<type>2d</type>
<filter>linear-mipmap-linear</filter>
<wrap-s>repeat</wrap-s>
<wrap-t>repeat</wrap-t>
<internal-format>normalized</internal-format>
</texture>
<texture n="14">
<image>Textures/Terrain/void.png</image>
<type>2d</type>
<filter>linear-mipmap-linear</filter>
<wrap-s>repeat</wrap-s>
<wrap-t>repeat</wrap-t>
<internal-format>normalized</internal-format>
</texture>
<texture n="15">
<image>Textures/Terrain/void.png</image>
<type>2d</type>
<filter>linear-mipmap-linear</filter>
<wrap-s>repeat</wrap-s>
<wrap-t>repeat</wrap-t>
<internal-format>normalized</internal-format>
</texture>-->
<texture n="20">
<image>Textures/Terrain/airport-grass-autumn.png</image>
<type>2d</type>
<filter>nearest-mipmap-nearest</filter>
<mag-filter>nearest</mag-filter>
<wrap-s>repeat</wrap-s>
<wrap-t>repeat</wrap-t>
<internal-format>normalized</internal-format>
</texture>
<!--<base_layer_magnification>5.0</base_layer_magnification>
<overlay_layer_magnification>4.0</overlay_layer_magnification>
<grain_layer_magnification>4.0</grain_layer_magnification>
<use_overlay>0</use_overlay>
<use_grain>0</use_grain>
<use_color_overlay>1</use_color_overlay>
<grit_alpha>1.0</grit_alpha>
<overlay_bias>0.0</overlay_bias>
<overlay_alpha>1.0</overlay_alpha>-->
<max_grass_height>0.3</max_grass_height>
<grass_density>1.0</grass_density>
<grass_groups>2</grass_groups>
<grass_modulate_by_overlay>0</grass_modulate_by_overlay>
<grass_modulate_height_min>0.0</grass_modulate_height_min>
<bend-x>0</bend-x>
<bend-y>0</bend-y>
</parameters>
<technique n="1">
<predicate>
<and>
<property>/sim/rendering/shaders/skydome</property>
<less-equal>
<value type="float">2.0</value>
<float-property>/sim/rendering/shaders/transition</float-property>
</less-equal>
<less-equal>
<value type="float">1.0</value>
<float-property>/sim/rendering/shaders/vegetation-effects</float-property>
</less-equal>
<equal>
<value type="float">0.0</value>
<float-property>/sim/rendering/rembrandt/enabled</float-property>
</equal>
<or>
<less-equal>
<value type="float">2.0</value>
<glversion/>
</less-equal>
<and>
<extension-supported>GL_ARB_shader_objects</extension-supported>
<extension-supported>GL_ARB_shading_language_100</extension-supported>
<extension-supported>GL_ARB_vertex_shader</extension-supported>
<extension-supported>GL_ARB_fragment_shader</extension-supported>
</and>
</or>
<extension-supported>GL_EXT_geometry_shader4</extension-supported>
</and>
</predicate>
<pass>
<lighting>true</lighting>
<material>
<ambient><use>material/ambient</use></ambient>
<diffuse><use>material/diffuse</use></diffuse>
<specular><use>material/specular</use></specular>
<emissive><use>material/emissive</use></emissive>
<shininess><use>material/shininess</use></shininess>
<color-mode>ambient-and-diffuse</color-mode>
</material>
<alpha-test><use>transparent</use></alpha-test>
<shade-model>smooth</shade-model>
<cull-face>back</cull-face>
<render-bin>
<bin-number>-1</bin-number>
<bin-name>RenderBin</bin-name>
</render-bin>
<program>
<vertex-shader>Shaders/trivial.vert</vertex-shader>
<fragment-shader>Shaders/trivial.frag</fragment-shader>
</program>
<color-mask type="vec4d">0 0 0 0</color-mask>
</pass>
<pass>
<lighting>true</lighting>
<material>
<ambient><use>material/ambient</use></ambient>
<diffuse><use>material/diffuse</use></diffuse>
<specular><use>material/specular</use></specular>
<emissive><use>material/emissive</use></emissive>
<shininess><use>material/shininess</use></shininess>
<color-mode>ambient-and-diffuse</color-mode>
</material>
<blend><use>transparent</use></blend>
<alpha-test><use>transparent</use></alpha-test>
<shade-model>smooth</shade-model>
<cull-face>back</cull-face>
<render-bin>
<bin-number><use>render-bin/bin-number</use></bin-number>
<bin-name><use>render-bin/bin-name</use></bin-name>
</render-bin>
<texture-unit>
<unit>0</unit>
<image><use>texture[13]/image</use></image>
<type><use>texture[13]/type</use></type>
<filter><use>texture[13]/filter</use></filter>
<wrap-s><use>texture[13]/wrap-s</use></wrap-s>
<wrap-t><use>texture[13]/wrap-t</use></wrap-t>
<internal-format>
<use>texture[13]/internal-format</use>
</internal-format>
</texture-unit>
<texture-unit>
<unit>1</unit>
<image><use>texture[14]/image</use></image>
<type><use>texture[14]/type</use></type>
<filter><use>texture[14]/filter</use></filter>
<wrap-s><use>texture[14]/wrap-s</use></wrap-s>
<wrap-t><use>texture[14]/wrap-t</use></wrap-t>
<internal-format>
<use>texture[14]/internal-format</use>
</internal-format>
</texture-unit>
<texture-unit>
<unit>2</unit>
<image><use>texture[15]/image</use></image>
<type><use>texture[15]/type</use></type>
<filter><use>texture[15]/filter</use></filter>
<wrap-s><use>texture[15]/wrap-s</use></wrap-s>
<wrap-t><use>texture[15]/wrap-t</use></wrap-t>
<internal-format>
<use>texture[15]/internal-format</use>
</internal-format>
</texture-unit>
<program>
<vertex-shader>Shaders/terrain-ALS-ultra.vert</vertex-shader>
<fragment-shader>Shaders/airfield-ALS.frag</fragment-shader>
<fragment-shader>Shaders/cloud-shadowfunc.frag</fragment-shader>
<fragment-shader>Shaders/noise.frag</fragment-shader>
<fragment-shader>Shaders/hazes.frag</fragment-shader>
<fragment-shader>Shaders/secondary_lights.frag</fragment-shader>
<fragment-shader>Shaders/filters-ALS.frag</fragment-shader>
</program>
<uniform>
<name>visibility</name>
<type>float</type>
<value><use>visibility</use></value>
</uniform>
<uniform>
<name>avisibility</name>
<type>float</type>
<value><use>avisibility</use></value>
</uniform>
<uniform>
<name>hazeLayerAltitude</name>
<type>float</type>
<value><use>lthickness</use></value>
</uniform>
<uniform>
<name>scattering</name>
<type>float</type>
<value><use>scattering</use></value>
</uniform>
<uniform>
<name>ground_scattering</name>
<type>float</type>
<value><use>ground_scattering</use></value>
</uniform>
<uniform>
<name>terminator</name>
<type>float</type>
<value><use>terminator</use></value>
</uniform>
<uniform>
<name>terrain_alt</name>
<type>float</type>
<value><use>terrain_alt</use></value>
</uniform>
<uniform>
<name>overcast</name>
<type>float</type>
<value><use>overcast</use></value>
</uniform>
<uniform>
<name>eye_alt</name>
<type>float</type>
<value><use>eye_alt</use></value>
</uniform>
<uniform>
<name>snowlevel</name>
<type>float</type>
<value><use>snow_level</use></value>
</uniform>
<uniform>
<name>snow_thickness_factor</name>
<type>float</type>
<value><use>snow_thickness_factor</use></value>
</uniform>
<uniform>
<name>dust_cover_factor</name>
<type>float</type>
<value> <use>dust_cover_factor</use></value>
</uniform>
<uniform>
<name>wetness</name>
<type>float</type>
<value> <use>wetness</use></value>
</uniform>
<uniform>
<name>fogstructure</name>
<type>float</type>
<value> <use>fogstructure</use></value>
</uniform>
<uniform>
<name>grit_alpha</name>
<type>float</type>
<value><use>grit_alpha</use></value>
</uniform>
<uniform>
<name>overlay_bias</name>
<type>float</type>
<value><use>overlay_bias</use></value>
</uniform>
<uniform>
<name>overlay_alpha</name>
<type>float</type>
<value><use>overlay_alpha</use></value>
</uniform>
<uniform>
<name>base_layer_magnification</name>
<type>float</type>
<value><use>base_layer_magnification</use></value>
</uniform>
<uniform>
<name>overlay_layer_magnification</name>
<type>float</type>
<value><use>overlay_layer_magnification</use></value>
</uniform>
<uniform>
<name>grain_layer_magnification</name>
<type>float</type>
<value><use>grain_layer_magnification</use></value>
</uniform>
<uniform>
<name>cloud_self_shading</name>
<type>float</type>
<value><use>cloud_self_shading</use></value>
</uniform>
<uniform>
<name>moonlight</name>
<type>float</type>
<value><use>moonlight</use></value>
</uniform>
<uniform>
<name>air_pollution</name>
<type>float</type>
<value><use>air_pollution</use></value>
</uniform>
<uniform>
<name>season</name>
<type>float</type>
<value><use>season</use></value>
</uniform>
<!-- secondary lights -->
<uniform>
<name>view_pitch_offset</name>
<type>float</type>
<value><use>view_pitch_offset</use></value>
</uniform>
<uniform>
<name>view_heading_offset</name>
<type>float</type>
<value><use>view_heading_offset</use></value>
</uniform>
<uniform>
<name>field_of_view</name>
<type>float</type>
<value><use>view_fov</use></value>
</uniform>
<uniform>
<name>landing_light1_offset</name>
<type>float</type>
<value><use>landing_light1_offset</use></value>
</uniform>
<uniform>
<name>landing_light2_offset</name>
<type>float</type>
<value><use>landing_light2_offset</use></value>
</uniform>
<uniform>
<name>landing_light3_offset</name>
<type>float</type>
<value><use>landing_light3_offset</use></value>
</uniform>
<!-- filtering -->
<uniform>
<name>gamma</name>
<type>float</type>
<value><use>gamma</use></value>
</uniform>
<uniform>
<name>brightness</name>
<type>float</type>
<value><use>brightness</use></value>
</uniform>
<uniform>
<name>use_night_vision</name>
<type>bool</type>
<value><use>use_night_vision</use></value>
</uniform>
<uniform>
<name>use_IR_vision</name>
<type>bool</type>
<value><use>use_IR_vision</use></value>
</uniform>
<uniform>
<name>use_filtering</name>
<type>bool</type>
<value><use>use_filtering</use></value>
</uniform>
<uniform>
<name>delta_T</name>
<type>float</type>
<value><use>delta_T</use></value>
</uniform>
<uniform>
<name>fact_grey</name>
<type>float</type>
<value><use>fact_grey</use></value>
</uniform>
<uniform>
<name>fact_black</name>
<type>float</type>
<value><use>fact_black</use></value>
</uniform>
<!-- cloud shadows -->
<uniform>
<name>cloudpos1_x</name>
<type>float</type>
<value><use>cloudpos1_x</use></value>
</uniform>
<uniform>
<name>cloudpos1_y</name>
<type>float</type>
<value><use>cloudpos1_y</use></value>
</uniform>
<uniform>
<name>cloudpos2_x</name>
<type>float</type>
<value><use>cloudpos2_x</use></value>
</uniform>
<uniform>
<name>cloudpos2_y</name>
<type>float</type>
<value><use>cloudpos2_y</use></value>
</uniform>
<uniform>
<name>cloudpos3_x</name>
<type>float</type>
<value><use>cloudpos3_x</use></value>
</uniform>
<uniform>
<name>cloudpos3_y</name>
<type>float</type>
<value><use>cloudpos3_y</use></value>
</uniform>
<uniform>
<name>cloudpos4_x</name>
<type>float</type>
<value><use>cloudpos4_x</use></value>
</uniform>
<uniform>
<name>cloudpos4_y</name>
<type>float</type>
<value><use>cloudpos4_y</use></value>
</uniform>
<uniform>
<name>cloudpos5_x</name>
<type>float</type>
<value><use>cloudpos5_x</use></value>
</uniform>
<uniform>
<name>cloudpos5_y</name>
<type>float</type>
<value><use>cloudpos5_y</use></value>
</uniform>
<uniform>
<name>cloudpos6_x</name>
<type>float</type>
<value><use>cloudpos6_x</use></value>
</uniform>
<uniform>
<name>cloudpos6_y</name>
<type>float</type>
<value><use>cloudpos6_y</use></value>
</uniform>
<uniform>
<name>cloudpos7_x</name>
<type>float</type>
<value><use>cloudpos7_x</use></value>
</uniform>
<uniform>
<name>cloudpos7_y</name>
<type>float</type>
<value><use>cloudpos7_y</use></value>
</uniform>
<uniform>
<name>cloudpos8_x</name>
<type>float</type>
<value><use>cloudpos8_x</use></value>
</uniform>
<uniform>
<name>cloudpos8_y</name>
<type>float</type>
<value><use>cloudpos8_y</use></value>
</uniform>
<uniform>
<name>cloudpos9_x</name>
<type>float</type>
<value><use>cloudpos9_x</use></value>
</uniform>
<uniform>
<name>cloudpos9_y</name>
<type>float</type>
<value><use>cloudpos9_y</use></value>
</uniform>
<uniform>
<name>cloudpos10_x</name>
<type>float</type>
<value><use>cloudpos10_x</use></value>
</uniform>
<uniform>
<name>cloudpos10_y</name>
<type>float</type>
<value><use>cloudpos10_y</use></value>
</uniform>
<uniform>
<name>cloudpos11_x</name>
<type>float</type>
<value><use>cloudpos11_x</use></value>
</uniform>
<uniform>
<name>cloudpos11_y</name>
<type>float</type>
<value><use>cloudpos11_y</use></value>
</uniform>
<uniform>
<name>cloudpos12_x</name>
<type>float</type>
<value><use>cloudpos12_x</use></value>
</uniform>
<uniform>
<name>cloudpos12_y</name>
<type>float</type>
<value><use>cloudpos12_y</use></value>
</uniform>
<uniform>
<name>cloudpos13_x</name>
<type>float</type>
<value><use>cloudpos13_x</use></value>
</uniform>
<uniform>
<name>cloudpos13_y</name>
<type>float</type>
<value><use>cloudpos13_y</use></value>
</uniform>
<uniform>
<name>cloudpos14_x</name>
<type>float</type>
<value><use>cloudpos14_x</use></value>
</uniform>
<uniform>
<name>cloudpos14_y</name>
<type>float</type>
<value><use>cloudpos14_y</use></value>
</uniform>
<uniform>
<name>cloudpos15_x</name>
<type>float</type>
<value><use>cloudpos15_x</use></value>
</uniform>
<uniform>
<name>cloudpos15_y</name>
<type>float</type>
<value><use>cloudpos15_y</use></value>
</uniform>
<uniform>
<name>cloudpos16_x</name>
<type>float</type>
<value><use>cloudpos16_x</use></value>
</uniform>
<uniform>
<name>cloudpos16_y</name>
<type>float</type>
<value><use>cloudpos16_y</use></value>
</uniform>
<uniform>
<name>cloudpos17_x</name>
<type>float</type>
<value><use>cloudpos17_x</use></value>
</uniform>
<uniform>
<name>cloudpos17_y</name>
<type>float</type>
<value><use>cloudpos17_y</use></value>
</uniform>
<uniform>
<name>cloudpos18_x</name>
<type>float</type>
<value><use>cloudpos18_x</use></value>
</uniform>
<uniform>
<name>cloudpos18_y</name>
<type>float</type>
<value><use>cloudpos18_y</use></value>
</uniform>
<uniform>
<name>cloudpos19_x</name>
<type>float</type>
<value><use>cloudpos19_x</use></value>
</uniform>
<uniform>
<name>cloudpos19_y</name>
<type>float</type>
<value><use>cloudpos19_y</use></value>
</uniform>
<uniform>
<name>cloudpos20_x</name>
<type>float</type>
<value><use>cloudpos20_x</use></value>
</uniform>
<uniform>
<name>cloudpos20_y</name>
<type>float</type>
<value><use>cloudpos20_y</use></value>
</uniform>
<uniform>
<name>cloud_shadow_flag</name>
<type>int</type>
<value><use>cloud_shadow_flag</use></value>
</uniform>
<uniform>
<name>quality_level</name>
<type>int</type>
<value> <use>quality_level</use></value>
</uniform>
<uniform>
<name>tquality_level</name>
<type>int</type>
<value> <use>tquality_level</use></value>
</uniform>
<uniform>
<name>use_overlay</name>
<type>int</type>
<value> <use>use_overlay</use></value>
</uniform>
<uniform>
<name>use_grain</name>
<type>int</type>
<value> <use>use_grain</use></value>
</uniform>
<uniform>
<name>use_color_overlay</name>
<type>int</type>
<value> <use>use_color_overlay</use></value>
</uniform>
<uniform>
<name>use_searchlight</name>
<type>int</type>
<value> <use>use_searchlight</use></value>
</uniform>
<uniform>
<name>use_landing_light</name>
<type>int</type>
<value> <use>use_landing_light</use></value>
</uniform>
<uniform>
<name>use_alt_landing_light</name>
<type>int</type>
<value> <use>use_alt_landing_light</use></value>
</uniform>
<uniform>
<name>display_xsize</name>
<type>int</type>
<value><use>display_xsize</use></value>
</uniform>
<uniform>
<name>display_ysize</name>
<type>int</type>
<value><use>display_ysize</use></value>
</uniform>
<uniform>
<name>raise_vertex</name>
<type>bool</type>
<value> <use>raise_vertex</use></value>
</uniform>
<uniform>
<name>texture</name>
<type>sampler-2d</type>
<value type="int">0</value>
</uniform>
<uniform>
<name>overlay_texture</name>
<type>sampler-2d</type>
<value type="int">1</value>
</uniform>
<uniform>
<name>grain_texture</name>
<type>sampler-2d</type>
<value type="int">2</value>
</uniform>
<uniform>
<name>colorMode</name>
<type>int</type>
<value>2</value> <!-- AMBIENT_AND_DIFFUSE -->
</uniform>
<depth>
<function>lequal</function>
<write-mask type="bool">false</write-mask>
</depth>
</pass>
<pass n="2">
<lighting>true</lighting>
<material>
<ambient><use>material/ambient</use></ambient>
<diffuse><use>material/diffuse</use></diffuse>
<specular><use>material/specular</use></specular>
<emissive><use>material/emissive</use></emissive>
<shininess><use>material/shininess</use></shininess>
<color-mode>ambient-and-diffuse</color-mode>
</material>
<alpha-test><use>transparent</use></alpha-test>
<shade-model>smooth</shade-model>
<cull-face>back</cull-face>
<!--<render-bin>
<bin-number>10</bin-number>
<bin-name>GrassBin</bin-name>
</render-bin>-->
<render-bin>
<bin-number>111</bin-number>
<bin-name>DepthSortedBin</bin-name>
</render-bin>
<texture-unit>
<unit>8</unit>
<type><use>texture[20]/type</use></type>
<image><use>texture[20]/image</use></image>
<filter><use>texture[20]/filter</use></filter>
<mag-filter><use>texture[20]/mag-filter</use></mag-filter>
<wrap-s><use>texture[20]/wrap-s</use></wrap-s>
<wrap-t><use>texture[20]/wrap-t</use></wrap-t>
<internal-format><use>texture[20]/internal-format</use></internal-format>
</texture-unit>
<program>
<vertex-shader n="0">Shaders/grass-ALS.vert</vertex-shader>
<geometry-shader>Shaders/grass-ALS.geom</geometry-shader>
<fragment-shader n="0">Shaders/grass-ALS.frag</fragment-shader>
<fragment-shader n="1">Shaders/noise.frag</fragment-shader>
<fragment-shader n="2">Shaders/filters-ALS.frag</fragment-shader>
<geometry-vertices-out type="int">96</geometry-vertices-out>
<geometry-input-type>triangles</geometry-input-type>
<geometry-output-type>triangle-strip</geometry-output-type>
</program>
<uniform>
<name>colorTex</name>
<type>sampler-2d</type>
<value type="int">8</value>
</uniform>
<uniform>
<name>visibility</name>
<type>float</type>
<value><use>visibility</use></value>
</uniform>
<uniform>
<name>scattering</name>
<type>float</type>
<value><use>scattering</use></value>
</uniform>
<uniform>
<name>bend_x</name>
<type>float</type>
<value>
<use>bend-x</use>
</value>
</uniform>
<uniform>
<name>bend_y</name>
<type>float</type>
<value>
<use>bend-y</use>
</value>
</uniform>
<uniform>
<name>overlay_bias</name>
<type>float</type>
<value><use>overlay_bias</use></value>
</uniform>
<uniform>
<name>max_height</name>
<type>float</type>
<value><use>max_grass_height</use></value>
</uniform>
<uniform>
<name>grass_density</name>
<type>float</type>
<value><use>grass_density</use></value>
</uniform>
<uniform>
<name>grass_modulate_height_min</name>
<type>float</type>
<value><use>grass_modulate_height_min</use></value>
</uniform>
<uniform>
<name>season</name>
<type>float</type>
<value><use>season</use></value>
</uniform>
<uniform>
<name>grass_modulate_by_overlay</name>
<type>int</type>
<value><use>grass_modulate_by_overlay</use></value>
</uniform>
<uniform>
<name>grass_groups</name>
<type>int</type>
<value><use>grass_groups</use></value>
</uniform>
<!-- filtering -->
<uniform>
<name>gamma</name>
<type>float</type>
<value><use>gamma</use></value>
</uniform>
<uniform>
<name>brightness</name>
<type>float</type>
<value><use>brightness</use></value>
</uniform>
<uniform>
<name>use_night_vision</name>
<type>bool</type>
<value><use>use_night_vision</use></value>
</uniform>
<uniform>
<name>use_IR_vision</name>
<type>bool</type>
<value><use>use_IR_vision</use></value>
</uniform>
<uniform>
<name>use_filtering</name>
<type>bool</type>
<value><use>use_filtering</use></value>
</uniform>
<uniform>
<name>delta_T</name>
<type>float</type>
<value><use>delta_T</use></value>
</uniform>
<uniform>
<name>fact_grey</name>
<type>float</type>
<value><use>fact_grey</use></value>
</uniform>
<uniform>
<name>fact_black</name>
<type>float</type>
<value><use>fact_black</use></value>
</uniform>
<uniform>
<name>display_xsize</name>
<type>int</type>
<value><use>display_xsize</use></value>
</uniform>
<uniform>
<name>display_ysize</name>
<type>int</type>
<value><use>display_ysize</use></value>
</uniform>
<blend>
<active>true</active>
<source>src-alpha</source>
<destination>one-minus-src-alpha</destination>
</blend>
<depth>
<write-mask>false</write-mask>
</depth>
</pass>
</technique>
</PropertyList>

View file

@ -14,7 +14,7 @@
<name>Airport</name>
<name>AirportKeep</name>
<name>Greenspace</name>
<effect>Effects/airfield</effect>
<effect>Effects/grass</effect>
<texture-set>
<texture>Terrain/airport-grass-autumn.png</texture>
<texture n="13">Terrain/airport-grass-autumn.png</texture>

144
Shaders/grass-ALS.frag Executable file
View file

@ -0,0 +1,144 @@
// -*-C++-*-
#version 120
#define BLADE_FRACTION 0.1
#define MAX_LAYERS 30
#define MAX_DISTANCE 1000.0
uniform float visibility;
uniform float scattering;
uniform float overlay_bias;
uniform float season;
uniform float max_height;
uniform float grass_density;
uniform float grass_modulate_height_min;
uniform float bend_x;
uniform float bend_y;
uniform int grass_modulate_by_overlay;
uniform int grass_groups;
uniform sampler2D colorTex;
uniform sampler2D densityTex;
uniform float osg_SimulationTime;
varying in vec2 g_rawpos; // Horizontal position in model space
varying in float g_distance_to_eye; // Distance to the camera. Layers were disregarded
flat in float g_layer; // The layer where the fragment lives (0-1 range)
flat in int g_num_layers;
float rand2D(in vec2 co);
float Noise2D(in vec2 co, in float wavelength);
vec3 filter_combined (in vec3 color) ;
float map(float s, float a1, float a2, float b1, float b2)
{
return b1+(s-a1)*(b2-b1)/(a2-a1);
}
float decodeBinary(float n, float layer)
{
return float(mod(floor(n*pow(0.5, layer)), 2.0));
}
float bladeNoise2D(in float x, in float y, in float dDensity, in float layer, in float d_factor, in float h_factor)
{
float integer_x = x - fract(x);
float fractional_x = x - integer_x;
float integer_y = y - fract(y);
float fractional_y = y - integer_y;
if (rand2D(vec2(integer_x+1.0, integer_y +1.0)) > dDensity)
{return 0.0;}
float hfact = 0.7 + 0.3 * (rand2D(vec2(integer_x, integer_y + 2.0)));
hfact *= h_factor;
if (layer > hfact) {return 0.0;}
float xoffset = (rand2D(vec2(integer_x, integer_y)) -0.5);
float yoffset = (rand2D(vec2(integer_x+1.0, integer_y)) - 0.5);
float xbend = (rand2D(vec2(integer_x+1.0, integer_y + 1.0)) - 0.5) + bend_x;
float ybend = (rand2D(vec2(integer_x, integer_y + 1.0)) - 0.5) + bend_y;
float fraction = BLADE_FRACTION * (0.5 + 0.5 * (1.0 - smoothstep(0.5, 1.0, layer)));
float bend = 0.5 * layer * layer;
vec2 truePos = vec2 (0.5 + xoffset * (1.0 - 2.0 * BLADE_FRACTION) + xbend * bend, 0.5 + yoffset * (1.0 -2.0 * BLADE_FRACTION) + ybend * bend);
float distance = length(truePos - vec2(fractional_x, fractional_y));
return 1.0 - step (fraction * d_factor, distance);
}
float BladeNoise2D(in vec2 coord, in float wavelength, in float dDensity, in float layer, in float d_factor, in float h_factor)
{
return bladeNoise2D(coord.x/wavelength, coord.y/wavelength, dDensity, layer, d_factor, h_factor);
}
void main()
{
vec2 texCoord = gl_TexCoord[0].st;
if (season > 1.6) {discard;}
if (g_distance_to_eye > MAX_DISTANCE) {discard;}
float noise_1m = Noise2D(g_rawpos.xy, 1.0);
float noise_2m = Noise2D(g_rawpos.xy, 2.0); ;
float noise_10m = Noise2D(g_rawpos.xy, 10.0);
float h_factor;
float overlay_mix = smoothstep(0.45, 0.65, overlay_bias + (0.5 * noise_1m + 0.1 * noise_2m + 0.4 * noise_10m));
if (grass_modulate_by_overlay == 1)
{h_factor = grass_modulate_height_min + (1.0 - grass_modulate_height_min) * (1.0 - overlay_mix) ;}
else
{h_factor = 1.0;}
float value = 0.0;
float d_fade =smoothstep(100.0, MAX_DISTANCE, g_distance_to_eye);
float d_factor = 1.0 + 1.0 * d_fade;
d_factor *= clamp(max_height/0.3,0.5, 1.0);
float bladeFlag = BladeNoise2D(texCoord, 0.015, grass_density, g_layer, d_factor, h_factor);
if (grass_groups >1) {bladeFlag += BladeNoise2D(texCoord, 0.01, grass_density, g_layer, d_factor, h_factor);}
if (grass_groups >2) {bladeFlag += BladeNoise2D(texCoord, 0.007, grass_density, g_layer, d_factor, h_factor);}
if (bladeFlag > 0.0) {value = 1.0;}
else {discard;}
vec3 texel = texture2D(colorTex, texCoord).rgb;
// autumn coloring
texel.r = min(1.0, (1.0 + 2.5 * 0.1 * season) * texel.r);
texel.g = texel.g;
texel.b = max(0.0, (1.0 - 4.0 * 0.1 * season) * texel.b);
float intensity = length(texel.rgb) * (1.0 - 0.5 * smoothstep(1.1,2.0,season));
texel.rgb = intensity * normalize(mix(texel.rgb, vec3(0.23,0.17,0.08), smoothstep(1.1,2.0, season)));
float base_alpha = clamp(0.4 * max_height/0.3, 0.4, 1.0);
value*= base_alpha * (1.0 - d_fade);
value *= 1.0 - smoothstep(visibility* 0.5, visibility, g_distance_to_eye);
value= clamp(value, 0.0, 1.0);
texel *= length(gl_LightSource[0].diffuse.rgb)/1.73 * scattering;
texel = clamp(texel, 0.0, 1.0);
vec4 fragColor = vec4 (texel, value);
fragColor.rgb = filter_combined(fragColor.rgb);
gl_FragColor = fragColor;
}

57
Shaders/grass-ALS.geom Executable file
View file

@ -0,0 +1,57 @@
// -*-C++-*-
#version 120
#extension GL_EXT_geometry_shader4 : enable
#define MAX_LAYERS 30
#define MIN_LAYERS 8
#define MAX_MINUS_MIN_LAYERS 22
uniform float max_height;
varying in vec3 v_normal[3];
varying out vec2 g_rawpos;
varying out float g_distance_to_eye;
flat varying out float g_layer;
flat varying out int g_num_layers;
float min3(in float a, in float b, in float c)
{
float m = a;
if (m > b) m = b;
if (m > c) m = c;
return m;
}
void main()
{
float distances[3];
distances[0] = -(gl_ModelViewMatrix * gl_PositionIn[0]).z;
distances[1] = -(gl_ModelViewMatrix * gl_PositionIn[1]).z;
distances[2] = -(gl_ModelViewMatrix * gl_PositionIn[2]).z;
float minDistance = min3(distances[0], distances[1], distances[2]);
//float avgDistance = (distances[0]+distances[1]+distances[2])*0.33;
int numLayers = MIN_LAYERS + int(smoothstep(500.0, 50.0, minDistance) * float(MAX_MINUS_MIN_LAYERS));
g_num_layers = numLayers;
float deltaLayer = 1.0 / float(numLayers);
float currDeltaLayer = deltaLayer * 0.5;
for (int layer = 0; layer < numLayers; ++layer) {
for (int i = 0; i < 3; ++i) {
vec4 pos = gl_PositionIn[i] + vec4(v_normal[i] * currDeltaLayer * max_height, 0.0);
g_rawpos = gl_PositionIn[i].xy;
g_distance_to_eye = distances[i];
g_layer = currDeltaLayer;
gl_Position = gl_ModelViewProjectionMatrix * pos;
gl_TexCoord[0] = gl_TexCoordIn[i][0];
EmitVertex();
}
EndPrimitive();
currDeltaLayer += deltaLayer;
}
}

17
Shaders/grass-ALS.vert Executable file
View file

@ -0,0 +1,17 @@
// -*-C++-*-
#version 120
// The UV scale controls the grass thickness. Lower numbers thicken the blades
// while higher numbers make them thinner.
#define UV_SCALE 10.0
varying vec3 v_normal;
void main()
{
gl_Position = gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0 * UV_SCALE;
v_normal = gl_Normal;
}

View file

@ -138,6 +138,7 @@ Started September 2000 by David Megginson, david@megginson.com
<urban type="float" userarchive="y">1.0</urban>
<water type="float" userarchive="y">1.0</water>
<wind-effects type="float" userarchive="y">0.0</wind-effects>
<vegetation-effects type="float" userarchive="y">0.0</vegetation-effects>
<forest type="float" userarchive="y">0.0</forest>
<lights type="float" userarchive="y">1.0</lights>
<quality-level-internal type="float" userarchive="y">1.0</quality-level-internal>

View file

@ -246,113 +246,31 @@
<pref-width>55</pref-width>
</empty>
</group>
<!--
<group>
<layout>hbox</layout>
<visible>
<not>
<property>/local-weather/tiles/tile-counter</property>
</not>
</visible>
<text>
<label>Atmospheric effects</label>
<halign>left</halign>
</text>
<hrule>
<stretch>true</stretch>
</hrule>
</group>
<group>
<layout>hbox</layout>
<halign>right</halign>
<visible>
<not>
<property>/local-weather/tiles/tile-counter</property>
</not>
</visible>
<text>
<label>Mie factor</label>
</text>
<slider>
<name>mie-factor</name>
<min>0.0</min>
<max>0.01</max>
<step>0.001</step>
<live>true</live>
<property>/sim/rendering/mie</property>
<binding>
<command>dialog-apply</command>
<object-name>mie-factor</object-name>
</binding>
</slider>
<text>
<label>12345678</label>
<format>%.3f</format>
<live>true</live>
<property>/sim/rendering/mie</property>
</text>
</group>
<group>
<layout>hbox</layout>
<halign>right</halign>
<visible>
<not>
<property>/local-weather/tiles/tile-counter</property>
</not>
</visible>
<text>
<label>Rayleigh factor</label>
<label>Overlay</label>
</text>
<slider>
<name>rayleigh-factor</name>
<min>0.0</min>
<max>0.001</max>
<step>0.0001</step>
<property>/sim/rendering/rayleigh</property>
<binding>
<command>dialog-apply</command>
<object-name>rayleigh-factor</object-name>
</binding>
</slider>
<text>
<label>12345678</label>
<format>%.4f</format>
<live>true</live>
<property>/sim/rendering/rayleigh</property>
</text>
</group>
<group>
<layout>hbox</layout>
<halign>right</halign>
<visible>
<not>
<property>/local-weather/tiles/tile-counter</property>
</not>
</visible>
<text>
<label>Density factor</label>
</text>
<slider>
<name>density-factor</name>
<name>vegetation</name>
<min>0.0</min>
<max>1.0</max>
<step>0.1</step>
<property>/sim/rendering/dome-density</property>
<step>1.0</step>
<fraction>0.17</fraction>
<live>true</live>
<property>/sim/rendering/shaders/vegetation-effects</property>
<binding>
<command>dialog-apply</command>
<object-name>density-factor</object-name>
<object-name>vegetation</object-name>
</binding>
</slider>
<text>
<label>12345678</label>
<format>%.1f</format>
<live>true</live>
<property>/sim/rendering/dome-density</property>
</text>
</group>-->
<empty>
<pref-width>55</pref-width>
</empty>
</group>
<group>
<layout>hbox</layout>