Improve memory and instantiation time of random buildings.
This commit is contained in:
parent
255d7f362f
commit
2f0a1683b7
5 changed files with 692 additions and 6 deletions
|
@ -37,7 +37,8 @@
|
||||||
<lightmap-color type="vec3d" n="3"> 1.0 1.0 1.0 </lightmap-color>-->
|
<lightmap-color type="vec3d" n="3"> 1.0 1.0 1.0 </lightmap-color>-->
|
||||||
<!-- Reflection -->
|
<!-- Reflection -->
|
||||||
<reflection-enabled type="int"> 1 </reflection-enabled>
|
<reflection-enabled type="int"> 1 </reflection-enabled>
|
||||||
<reflect-map-enabled type="int"> 1 </reflect-map-enabled>
|
<!-- <reflect-map-enabled type="int"> 1 </reflect-map-enabled> -->
|
||||||
|
<reflect-map-enabled type="int"> 0 </reflect-map-enabled>
|
||||||
<reflection-correction type="float"> 0.10 </reflection-correction>
|
<reflection-correction type="float"> 0.10 </reflection-correction>
|
||||||
<reflection-dynamic type="int"> 0 </reflection-dynamic>
|
<reflection-dynamic type="int"> 0 </reflection-dynamic>
|
||||||
<reflection-fresnel type="float"> 0.0 </reflection-fresnel>
|
<reflection-fresnel type="float"> 0.0 </reflection-fresnel>
|
||||||
|
@ -147,7 +148,7 @@
|
||||||
</texture-unit>
|
</texture-unit>
|
||||||
<program>
|
<program>
|
||||||
<vertex-shader n="0">Shaders/include_fog.vert</vertex-shader>
|
<vertex-shader n="0">Shaders/include_fog.vert</vertex-shader>
|
||||||
<vertex-shader n="1">Shaders/default.vert</vertex-shader>
|
<vertex-shader n="1">Shaders/building-default.vert</vertex-shader>
|
||||||
<fragment-shader n="0">Shaders/include_fog.frag</fragment-shader>
|
<fragment-shader n="0">Shaders/include_fog.frag</fragment-shader>
|
||||||
<fragment-shader n="1">Shaders/terrain-nocolor.frag</fragment-shader>
|
<fragment-shader n="1">Shaders/terrain-nocolor.frag</fragment-shader>
|
||||||
</program>
|
</program>
|
||||||
|
@ -187,7 +188,7 @@
|
||||||
</internal-format>
|
</internal-format>
|
||||||
</texture-unit>
|
</texture-unit>
|
||||||
<program>
|
<program>
|
||||||
<vertex-shader>Shaders/terrain-haze.vert</vertex-shader>
|
<vertex-shader>Shaders/building-haze.vert</vertex-shader>
|
||||||
<fragment-shader>Shaders/terrain-haze.frag</fragment-shader>
|
<fragment-shader>Shaders/terrain-haze.frag</fragment-shader>
|
||||||
</program>
|
</program>
|
||||||
<uniform>
|
<uniform>
|
||||||
|
@ -272,8 +273,38 @@
|
||||||
<use>texture[3]/internal-format</use>
|
<use>texture[3]/internal-format</use>
|
||||||
</internal-format>
|
</internal-format>
|
||||||
</texture-unit>
|
</texture-unit>
|
||||||
|
<program n="0">
|
||||||
|
<vertex-shader n="0">Shaders/building-ubershader.vert</vertex-shader>
|
||||||
|
</program>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
|
<technique n="8">
|
||||||
|
<pass>
|
||||||
|
<texture-unit n="4">
|
||||||
|
<unit>4</unit>
|
||||||
|
<image>
|
||||||
|
<use>texture[3]/image</use>
|
||||||
|
</image>
|
||||||
|
<filter>
|
||||||
|
<use>texture[3]/filter</use>
|
||||||
|
</filter>
|
||||||
|
<wrap-s>
|
||||||
|
<use>texture[3]/wrap-s</use>
|
||||||
|
</wrap-s>
|
||||||
|
<wrap-t>
|
||||||
|
<use>texture[3]/wrap-t</use>
|
||||||
|
</wrap-t>
|
||||||
|
<internal-format>
|
||||||
|
<use>texture[3]/internal-format</use>
|
||||||
|
</internal-format>
|
||||||
|
</texture-unit>
|
||||||
|
<program n="0">
|
||||||
|
<vertex-shader n="1">Shaders/building-ubershader.vert</vertex-shader>
|
||||||
|
</program>
|
||||||
|
</pass>
|
||||||
|
</technique>
|
||||||
|
|
||||||
<technique n="9">
|
<technique n="9">
|
||||||
<pass>
|
<pass>
|
||||||
<texture-unit n="4">
|
<texture-unit n="4">
|
||||||
|
@ -294,6 +325,171 @@
|
||||||
<use>texture[3]/internal-format</use>
|
<use>texture[3]/internal-format</use>
|
||||||
</internal-format>
|
</internal-format>
|
||||||
</texture-unit>
|
</texture-unit>
|
||||||
|
<program n="0">
|
||||||
|
<vertex-shader n="1">Shaders/building-ubershader.vert</vertex-shader>
|
||||||
|
</program>
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
|
|
||||||
|
<technique n="10">
|
||||||
|
<pass>
|
||||||
|
<program n="0">
|
||||||
|
<vertex-shader n="0">Shaders/building-deferred-gbuffer.vert</vertex-shader>
|
||||||
|
</program>
|
||||||
|
</pass>
|
||||||
|
</technique>
|
||||||
|
|
||||||
|
<technique n="11">
|
||||||
|
<pass>
|
||||||
|
<program n="0">
|
||||||
|
<vertex-shader n="0">Shaders/building-default.vert</vertex-shader>
|
||||||
|
</program>
|
||||||
|
</pass>
|
||||||
|
</technique>
|
||||||
|
|
||||||
|
<technique n="12">
|
||||||
|
<pass>
|
||||||
|
<lighting>true</lighting>
|
||||||
|
<material>
|
||||||
|
<active>
|
||||||
|
<use>material/active</use>
|
||||||
|
</active>
|
||||||
|
<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>off</color-mode>
|
||||||
|
</material>
|
||||||
|
<render-bin>
|
||||||
|
<bin-number>2</bin-number>
|
||||||
|
<bin-name>RenderBin</bin-name>
|
||||||
|
</render-bin>
|
||||||
|
<blend>
|
||||||
|
<active>
|
||||||
|
<use>blend/active</use>
|
||||||
|
</active>
|
||||||
|
<source>
|
||||||
|
<use>blend/source</use>
|
||||||
|
</source>
|
||||||
|
<destination>
|
||||||
|
<use>blend/destination</use>
|
||||||
|
</destination>
|
||||||
|
</blend>
|
||||||
|
<shade-model>
|
||||||
|
<use>shade-model</use>
|
||||||
|
</shade-model>
|
||||||
|
<cull-face>
|
||||||
|
<use>cull-face</use>
|
||||||
|
</cull-face>
|
||||||
|
<rendering-hint>
|
||||||
|
<use>rendering-hint</use>
|
||||||
|
</rendering-hint>
|
||||||
|
<texture-unit>
|
||||||
|
<!-- The texture unit is always active because the shaders expect
|
||||||
|
that. -->
|
||||||
|
<unit>0</unit>
|
||||||
|
<!-- If there is a texture, the type in the derived effect
|
||||||
|
will be "2d". -->
|
||||||
|
<type>
|
||||||
|
<use>texture[0]/type</use>
|
||||||
|
</type>
|
||||||
|
<image>
|
||||||
|
<use>texture[0]/image</use>
|
||||||
|
</image>
|
||||||
|
<filter>
|
||||||
|
<use>texture[0]/filter</use>
|
||||||
|
</filter>
|
||||||
|
<wrap-s>
|
||||||
|
<use>texture[0]/wrap-s</use>
|
||||||
|
</wrap-s>
|
||||||
|
<wrap-t>
|
||||||
|
<use>texture[0]/wrap-t</use>
|
||||||
|
</wrap-t>
|
||||||
|
<!--
|
||||||
|
<internal-format>
|
||||||
|
<use>texture[0]/internal-format</use>
|
||||||
|
</internal-format>
|
||||||
|
-->
|
||||||
|
</texture-unit>
|
||||||
|
<vertex-program-two-side>
|
||||||
|
<use>vertex-program-two-side</use>
|
||||||
|
</vertex-program-two-side>
|
||||||
|
<program>
|
||||||
|
<!-- <vertex-shader n="0">Shaders/include_fog.vert</vertex-shader> -->
|
||||||
|
<!--fog include-->
|
||||||
|
<vertex-shader n="1">Shaders/building-default.vert</vertex-shader>
|
||||||
|
<fragment-shader n="0">Shaders/include_fog.frag</fragment-shader>
|
||||||
|
<!--fog include-->
|
||||||
|
<fragment-shader n="1">Shaders/default.frag</fragment-shader>
|
||||||
|
</program>
|
||||||
|
<!-- BEGIN fog include -->
|
||||||
|
<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>terminator</name>
|
||||||
|
<type>float</type>
|
||||||
|
<value>
|
||||||
|
<use>terminator</use>
|
||||||
|
</value>
|
||||||
|
</uniform>
|
||||||
|
<uniform>
|
||||||
|
<name>fogType</name>
|
||||||
|
<type>int</type>
|
||||||
|
<value>
|
||||||
|
<use>fogtype</use>
|
||||||
|
</value>
|
||||||
|
</uniform>
|
||||||
|
<!-- END fog include -->
|
||||||
|
<uniform>
|
||||||
|
<name>texture</name>
|
||||||
|
<type>sampler-2d</type>
|
||||||
|
<value type="int">0</value>
|
||||||
|
</uniform>
|
||||||
|
<uniform>
|
||||||
|
<name>colorMode</name>
|
||||||
|
<type>int</type>
|
||||||
|
<value>
|
||||||
|
<use>material/color-mode-uniform</use>
|
||||||
|
</value>
|
||||||
|
</uniform>
|
||||||
|
</pass>
|
||||||
|
</technique>
|
||||||
|
|
||||||
</PropertyList>
|
</PropertyList>
|
||||||
|
|
80
Shaders/building-default.vert
Normal file
80
Shaders/building-default.vert
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
// -*-C++-*-
|
||||||
|
|
||||||
|
// Shader that uses OpenGL state values to do per-pixel lighting
|
||||||
|
//
|
||||||
|
// The only light used is gl_LightSource[0], which is assumed to be
|
||||||
|
// directional.
|
||||||
|
//
|
||||||
|
// Diffuse colors come from the gl_Color, ambient from the material. This is
|
||||||
|
// equivalent to osg::Material::DIFFUSE.
|
||||||
|
#version 120
|
||||||
|
#define MODE_OFF 0
|
||||||
|
#define MODE_DIFFUSE 1
|
||||||
|
#define MODE_AMBIENT_AND_DIFFUSE 2
|
||||||
|
|
||||||
|
// The constant term of the lighting equation that doesn't depend on
|
||||||
|
// the surface normal is passed in gl_{Front,Back}Color. The alpha
|
||||||
|
// component is set to 1 for front, 0 for back in order to work around
|
||||||
|
// bugs with gl_FrontFacing in the fragment shader.
|
||||||
|
varying vec4 diffuse_term;
|
||||||
|
varying vec3 normal;
|
||||||
|
|
||||||
|
uniform int colorMode;
|
||||||
|
|
||||||
|
////fog "include"////////
|
||||||
|
//uniform int fogType;
|
||||||
|
//
|
||||||
|
//void fog_Func(int type);
|
||||||
|
/////////////////////////
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
|
||||||
|
// Determine the rotation for the building. The Color alpha value provides rotation information
|
||||||
|
float sr = sin(6.28 * gl_Color.a);
|
||||||
|
float cr = cos(6.28 * gl_Color.a);
|
||||||
|
|
||||||
|
vec3 position = gl_Vertex.xyz;
|
||||||
|
|
||||||
|
// Rotation of the building and movement into position
|
||||||
|
position.xy = vec2(dot(position.xy, vec2(cr, sr)), dot(position.xy, vec2(-sr, cr)));
|
||||||
|
position = position + gl_Color.xyz;
|
||||||
|
|
||||||
|
gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0);
|
||||||
|
|
||||||
|
//gl_Position = ftransform();
|
||||||
|
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
|
||||||
|
|
||||||
|
// Rotate the normal.
|
||||||
|
normal = gl_Normal;
|
||||||
|
normal.xy = vec2(dot(normal.xy, vec2(cr, sr)), dot(normal.xy, vec2(-sr, cr)));
|
||||||
|
normal = gl_NormalMatrix * normal;
|
||||||
|
|
||||||
|
vec4 ambient_color, diffuse_color;
|
||||||
|
if (colorMode == MODE_DIFFUSE) {
|
||||||
|
diffuse_color = vec4(1.0,1.0,1.0,1.0);
|
||||||
|
ambient_color = gl_FrontMaterial.ambient;
|
||||||
|
} else if (colorMode == MODE_AMBIENT_AND_DIFFUSE) {
|
||||||
|
diffuse_color = vec4(1.0,1.0,1.0,1.0);
|
||||||
|
ambient_color = vec4(1.0,1.0,1.0,1.0);
|
||||||
|
} else {
|
||||||
|
diffuse_color = gl_FrontMaterial.diffuse;
|
||||||
|
ambient_color = gl_FrontMaterial.ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
diffuse_term = diffuse_color * gl_LightSource[0].diffuse;
|
||||||
|
vec4 constant_term = gl_FrontMaterial.emission + ambient_color *
|
||||||
|
(gl_LightModel.ambient + gl_LightSource[0].ambient);
|
||||||
|
// Super hack: if diffuse material alpha is less than 1, assume a
|
||||||
|
// transparency animation is at work
|
||||||
|
if (gl_FrontMaterial.diffuse.a < 1.0)
|
||||||
|
diffuse_term.a = gl_FrontMaterial.diffuse.a;
|
||||||
|
else
|
||||||
|
diffuse_term.a = 1.0;
|
||||||
|
// Another hack for supporting two-sided lighting without using
|
||||||
|
// gl_FrontFacing in the fragment shader.
|
||||||
|
gl_FrontColor.rgb = constant_term.rgb; gl_FrontColor.a = 1.0;
|
||||||
|
gl_BackColor.rgb = constant_term.rgb; gl_BackColor.a = 0.0;
|
||||||
|
//fogCoord = abs(ecPosition.z / ecPosition.w);
|
||||||
|
//fog_Func(fogType);
|
||||||
|
}
|
30
Shaders/building-deferred-gbuffer.vert
Normal file
30
Shaders/building-deferred-gbuffer.vert
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// -*- mode: C; -*-
|
||||||
|
// Licence: GPL v2
|
||||||
|
// Author: Frederic Bouvier.
|
||||||
|
//
|
||||||
|
|
||||||
|
varying vec3 ecNormal;
|
||||||
|
varying float alpha;
|
||||||
|
void main() {
|
||||||
|
// Determine the rotation for the building. The Color alpha value provides rotation information
|
||||||
|
float sr = sin(6.28 * gl_Color.a);
|
||||||
|
float cr = cos(6.28 * gl_Color.a);
|
||||||
|
|
||||||
|
vec3 position = gl_Vertex.xyz;
|
||||||
|
|
||||||
|
// Rotation of the building and movement into position
|
||||||
|
position.xy = vec2(dot(position.xy, vec2(cr, sr)), dot(position.xy, vec2(-sr, cr)));
|
||||||
|
position = position + gl_Color.xyz;
|
||||||
|
|
||||||
|
gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0);
|
||||||
|
|
||||||
|
// Rotate the normal.
|
||||||
|
ecNormal = gl_Normal;
|
||||||
|
ecNormal.xy = vec2(dot(ecNormal.xy, vec2(cr, sr)), dot(ecNormal.xy, vec2(-sr, cr)));
|
||||||
|
ecNormal = gl_NormalMatrix * ecNormal;
|
||||||
|
|
||||||
|
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
|
||||||
|
gl_FrontColor = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
gl_BackColor = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
alpha = 1.0;
|
||||||
|
}
|
254
Shaders/building-haze.vert
Normal file
254
Shaders/building-haze.vert
Normal file
|
@ -0,0 +1,254 @@
|
||||||
|
// -*-C++-*-
|
||||||
|
|
||||||
|
// Shader that uses OpenGL state values to do per-pixel lighting
|
||||||
|
//
|
||||||
|
// The only light used is gl_LightSource[0], which is assumed to be
|
||||||
|
// directional.
|
||||||
|
//
|
||||||
|
// Diffuse colors come from the gl_Color, ambient from the material. This is
|
||||||
|
// equivalent to osg::Material::DIFFUSE.
|
||||||
|
// Haze part added by Thorsten Renk, Oct. 2011
|
||||||
|
|
||||||
|
|
||||||
|
#define MODE_OFF 0
|
||||||
|
#define MODE_DIFFUSE 1
|
||||||
|
#define MODE_AMBIENT_AND_DIFFUSE 2
|
||||||
|
|
||||||
|
// The constant term of the lighting equation that doesn't depend on
|
||||||
|
// the surface normal is passed in gl_{Front,Back}Color. The alpha
|
||||||
|
// component is set to 1 for front, 0 for back in order to work around
|
||||||
|
// bugs with gl_FrontFacing in the fragment shader.
|
||||||
|
varying vec4 diffuse_term;
|
||||||
|
varying vec3 normal;
|
||||||
|
varying vec3 relPos;
|
||||||
|
|
||||||
|
//varying float earthShade;
|
||||||
|
//varying float yprime;
|
||||||
|
//varying float vertex_alt;
|
||||||
|
varying float yprime_alt;
|
||||||
|
varying float mie_angle;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uniform int colorMode;
|
||||||
|
uniform float hazeLayerAltitude;
|
||||||
|
uniform float terminator;
|
||||||
|
uniform float terrain_alt;
|
||||||
|
uniform float avisibility;
|
||||||
|
uniform float visibility;
|
||||||
|
uniform float overcast;
|
||||||
|
//uniform float scattering;
|
||||||
|
uniform float ground_scattering;
|
||||||
|
|
||||||
|
|
||||||
|
// This is the value used in the skydome scattering shader - use the same here for consistency?
|
||||||
|
const float EarthRadius = 5800000.0;
|
||||||
|
const float terminator_width = 200000.0;
|
||||||
|
|
||||||
|
|
||||||
|
float earthShade;
|
||||||
|
|
||||||
|
float light_func (in float x, in float a, in float b, in float c, in float d, in float e)
|
||||||
|
{
|
||||||
|
//x = x - 0.5;
|
||||||
|
|
||||||
|
// use the asymptotics to shorten computations
|
||||||
|
if (x < -15.0) {return 0.0;}
|
||||||
|
|
||||||
|
return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
|
||||||
|
vec4 light_diffuse;
|
||||||
|
vec4 light_ambient;
|
||||||
|
|
||||||
|
//float yprime_alt;
|
||||||
|
float yprime;
|
||||||
|
float lightArg;
|
||||||
|
float intensity;
|
||||||
|
float vertex_alt;
|
||||||
|
float scattering;
|
||||||
|
|
||||||
|
// this code is copied from default.vert
|
||||||
|
|
||||||
|
//vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
|
||||||
|
// Determine the rotation for the building. The Color alpha value provides rotation information
|
||||||
|
float sr = sin(6.28 * gl_Color.a);
|
||||||
|
float cr = cos(6.28 * gl_Color.a);
|
||||||
|
|
||||||
|
vec3 position = gl_Vertex.xyz;
|
||||||
|
|
||||||
|
// Rotation of the building and movement into position
|
||||||
|
position.xy = vec2(dot(position.xy, vec2(cr, sr)), dot(position.xy, vec2(-sr, cr)));
|
||||||
|
position = position + gl_Color.xyz;
|
||||||
|
|
||||||
|
gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0);
|
||||||
|
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
|
||||||
|
|
||||||
|
// Rotate the normal.
|
||||||
|
normal = gl_Normal;
|
||||||
|
normal.xy = vec2(dot(normal.xy, vec2(cr, sr)), dot(normal.xy, vec2(-sr, cr)));
|
||||||
|
normal = gl_NormalMatrix * normal;
|
||||||
|
|
||||||
|
vec4 ambient_color, diffuse_color;
|
||||||
|
if (colorMode == MODE_DIFFUSE) {
|
||||||
|
diffuse_color = vec4(1.0,1.0,1.0,1.0);
|
||||||
|
ambient_color = gl_FrontMaterial.ambient;
|
||||||
|
} else if (colorMode == MODE_AMBIENT_AND_DIFFUSE) {
|
||||||
|
diffuse_color = vec4(1.0,1.0,1.0,1.0);
|
||||||
|
ambient_color = vec4(1.0,1.0,1.0,1.0);
|
||||||
|
} else {
|
||||||
|
diffuse_color = gl_FrontMaterial.diffuse;
|
||||||
|
ambient_color = gl_FrontMaterial.ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
// here start computations for the haze layer
|
||||||
|
// we need several geometrical quantities
|
||||||
|
|
||||||
|
// first current altitude of eye position in model space
|
||||||
|
vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
|
||||||
|
|
||||||
|
// and relative position to vector
|
||||||
|
relPos = gl_Vertex.xyz + gl_Color.xyz - ep.xyz;
|
||||||
|
|
||||||
|
// unfortunately, we need the distance in the vertex shader, although the more accurate version
|
||||||
|
// is later computed in the fragment shader again
|
||||||
|
float dist = length(relPos);
|
||||||
|
|
||||||
|
// altitude of the vertex in question, somehow zero leads to artefacts, so ensure it is at least 100m
|
||||||
|
vertex_alt = max(gl_Vertex.z + gl_Color.z,100.0);
|
||||||
|
scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt);
|
||||||
|
|
||||||
|
// branch dependent on daytime
|
||||||
|
|
||||||
|
if (terminator < 1000000.0) // the full, sunrise and sunset computation
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
// establish coordinates relative to sun position
|
||||||
|
|
||||||
|
vec3 lightFull = (gl_ModelViewMatrixInverse * gl_LightSource[0].position).xyz;
|
||||||
|
vec3 lightHorizon = normalize(vec3(lightFull.x,lightFull.y, 0.0));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// yprime is the distance of the vertex into sun direction
|
||||||
|
yprime = -dot(relPos, lightHorizon);
|
||||||
|
|
||||||
|
// this gets an altitude correction, higher terrain gets to see the sun earlier
|
||||||
|
yprime_alt = yprime - sqrt(2.0 * EarthRadius * vertex_alt);
|
||||||
|
|
||||||
|
// two times terminator width governs how quickly light fades into shadow
|
||||||
|
// now the light-dimming factor
|
||||||
|
earthShade = 0.6 * (1.0 - smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt)) + 0.4;
|
||||||
|
|
||||||
|
// parametrized version of the Flightgear ground lighting function
|
||||||
|
lightArg = (terminator-yprime_alt)/100000.0;
|
||||||
|
|
||||||
|
// directional scattering for low sun
|
||||||
|
if (lightArg < 10.0)
|
||||||
|
{mie_angle = (0.5 * dot(normalize(relPos), normalize(lightFull)) ) + 0.5;}
|
||||||
|
else
|
||||||
|
{mie_angle = 1.0;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
light_diffuse.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0);
|
||||||
|
light_diffuse.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0);
|
||||||
|
light_diffuse.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0);
|
||||||
|
light_diffuse.a = 0.0;
|
||||||
|
light_diffuse = light_diffuse * scattering;
|
||||||
|
|
||||||
|
light_ambient.b = light_func(lightArg, 0.000506, 0.131, -3.315, 0.000457, 0.5);
|
||||||
|
light_ambient.g = light_func(lightArg, 2.264e-05, 0.134, 0.967, 3.66e-05, 0.4);
|
||||||
|
light_ambient.r = light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.33);
|
||||||
|
light_ambient.a = 0.0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// correct ambient light intensity and hue before sunrise
|
||||||
|
if (earthShade < 0.5)
|
||||||
|
{
|
||||||
|
light_ambient = light_ambient * (0.7 + 0.3 * smoothstep(0.2, 0.5, earthShade));
|
||||||
|
intensity = length(light_ambient.xyz);
|
||||||
|
|
||||||
|
light_ambient.xyz = intensity * normalize(mix(light_ambient.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.8,earthShade) ));
|
||||||
|
|
||||||
|
intensity = length(light_diffuse.xyz);
|
||||||
|
light_diffuse.xyz = intensity * normalize(mix(light_diffuse.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.7,earthShade) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// the haze gets the light at the altitude of the haze top if the vertex in view is below
|
||||||
|
// but the light at the vertex if the vertex is above
|
||||||
|
|
||||||
|
vertex_alt = max(vertex_alt,hazeLayerAltitude);
|
||||||
|
|
||||||
|
if (vertex_alt > hazeLayerAltitude)
|
||||||
|
{
|
||||||
|
if (dist > 0.8 * avisibility)
|
||||||
|
{
|
||||||
|
vertex_alt = mix(vertex_alt, hazeLayerAltitude, smoothstep(0.8*avisibility, avisibility, dist));
|
||||||
|
yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vertex_alt = hazeLayerAltitude;
|
||||||
|
yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else // the faster, full-day version without lightfields
|
||||||
|
{
|
||||||
|
//vertex_alt = max(gl_Vertex.z,100.0);
|
||||||
|
|
||||||
|
earthShade = 1.0;
|
||||||
|
mie_angle = 1.0;
|
||||||
|
|
||||||
|
if (terminator > 3000000.0)
|
||||||
|
{light_diffuse = vec4 (1.0, 1.0, 1.0, 0.0);
|
||||||
|
light_ambient = vec4 (0.33, 0.4, 0.5, 0.0); }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
lightArg = (terminator/100000.0 - 10.0)/20.0;
|
||||||
|
light_diffuse.b = 0.78 + lightArg * 0.21;
|
||||||
|
light_diffuse.g = 0.907 + lightArg * 0.091;
|
||||||
|
light_diffuse.r = 0.904 + lightArg * 0.092;
|
||||||
|
light_diffuse.a = 0.0;
|
||||||
|
|
||||||
|
light_ambient.b = 0.41 + lightArg * 0.08;
|
||||||
|
light_ambient.g = 0.333 + lightArg * 0.06;
|
||||||
|
light_ambient.r = 0.316 + lightArg * 0.016;
|
||||||
|
light_ambient.a = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
light_diffuse = light_diffuse * scattering;
|
||||||
|
yprime_alt = -sqrt(2.0 * EarthRadius * hazeLayerAltitude);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// default lighting based on texture and material using the light we have just computed
|
||||||
|
|
||||||
|
diffuse_term = diffuse_color* light_diffuse;
|
||||||
|
vec4 constant_term = gl_FrontMaterial.emission + ambient_color *
|
||||||
|
(gl_LightModel.ambient + light_ambient);
|
||||||
|
// Super hack: if diffuse material alpha is less than 1, assume a
|
||||||
|
// transparency animation is at work
|
||||||
|
if (gl_FrontMaterial.diffuse.a < 1.0)
|
||||||
|
diffuse_term.a = gl_FrontMaterial.diffuse.a;
|
||||||
|
else
|
||||||
|
diffuse_term.a = 1.0;
|
||||||
|
// Another hack for supporting two-sided lighting without using
|
||||||
|
// gl_FrontFacing in the fragment shader.
|
||||||
|
gl_FrontColor.rgb = constant_term.rgb; gl_FrontColor.a = 1.0;
|
||||||
|
gl_BackColor.rgb = constant_term.rgb; gl_BackColor.a = 0.0;
|
||||||
|
}
|
||||||
|
|
126
Shaders/building-ubershader.vert
Normal file
126
Shaders/building-ubershader.vert
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
// -*- mode: C; -*-
|
||||||
|
// Licence: GPL v2
|
||||||
|
// © Emilian Huminiuc and Vivian Meazza 2011
|
||||||
|
#version 120
|
||||||
|
|
||||||
|
varying vec3 rawpos;
|
||||||
|
varying vec3 VNormal;
|
||||||
|
varying vec3 VTangent;
|
||||||
|
varying vec3 VBinormal;
|
||||||
|
varying vec3 vViewVec;
|
||||||
|
varying vec3 reflVec;
|
||||||
|
|
||||||
|
varying float alpha;
|
||||||
|
|
||||||
|
attribute vec3 tangent;
|
||||||
|
attribute vec3 binormal;
|
||||||
|
|
||||||
|
uniform float pitch;
|
||||||
|
uniform float roll;
|
||||||
|
uniform float hdg;
|
||||||
|
uniform int refl_dynamic;
|
||||||
|
uniform int nmap_enabled;
|
||||||
|
uniform int shader_qual;
|
||||||
|
uniform int rembrandt_enabled;
|
||||||
|
uniform int color_is_position;
|
||||||
|
|
||||||
|
//////Fog Include///////////
|
||||||
|
// uniform int fogType;
|
||||||
|
// void fog_Func(int type);
|
||||||
|
////////////////////////////
|
||||||
|
|
||||||
|
void rotationMatrixPR(in float sinRx, in float cosRx, in float sinRy, in float cosRy, out mat4 rotmat)
|
||||||
|
{
|
||||||
|
rotmat = mat4( cosRy , sinRx * sinRy , cosRx * sinRy, 0.0,
|
||||||
|
0.0 , cosRx , -sinRx * cosRx, 0.0,
|
||||||
|
-sinRy, sinRx * cosRy, cosRx * cosRy , 0.0,
|
||||||
|
0.0 , 0.0 , 0.0 , 1.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void rotationMatrixH(in float sinRz, in float cosRz, out mat4 rotmat)
|
||||||
|
{
|
||||||
|
rotmat = mat4( cosRz, -sinRz, 0.0, 0.0,
|
||||||
|
sinRz, cosRz, 0.0, 0.0,
|
||||||
|
0.0 , 0.0 , 1.0, 0.0,
|
||||||
|
0.0 , 0.0 , 0.0, 1.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
float sr = sin(6.28 * gl_Color.a);
|
||||||
|
float cr = cos(6.28 * gl_Color.a);
|
||||||
|
rawpos = gl_Vertex.xyz;
|
||||||
|
|
||||||
|
// Rotation of the object and movement into position
|
||||||
|
rawpos.xy = vec2(dot(rawpos.xy, vec2(cr, sr)), dot(rawpos.xy, vec2(-sr, cr)));
|
||||||
|
rawpos = rawpos + gl_Color.xyz;
|
||||||
|
|
||||||
|
vec4 ecPosition = gl_ModelViewMatrix * vec4(rawpos.x, rawpos.y, rawpos.z, 1.0);
|
||||||
|
//fog_Func(fogType);
|
||||||
|
|
||||||
|
// Rotate the normal.
|
||||||
|
vec3 normal = gl_Normal;
|
||||||
|
normal.xy = vec2(dot(normal.xy, vec2(cr, sr)), dot(normal.xy, vec2(-sr, cr)));
|
||||||
|
normal = gl_NormalMatrix * normal;
|
||||||
|
|
||||||
|
VNormal = normalize(normal);
|
||||||
|
if (nmap_enabled > 0 && shader_qual > 2){
|
||||||
|
VTangent = normalize(gl_NormalMatrix * tangent);
|
||||||
|
VBinormal = normalize(gl_NormalMatrix * binormal);
|
||||||
|
} else {
|
||||||
|
VTangent = vec3(0.0);
|
||||||
|
VBinormal = vec3 (0.0);
|
||||||
|
}
|
||||||
|
vec3 n = normalize(normal);
|
||||||
|
vec3 t = cross(n, vec3(1.0,0.0,0.0));
|
||||||
|
vec3 b = cross(n,t);
|
||||||
|
|
||||||
|
// Super hack: if diffuse material alpha is less than 1, assume a
|
||||||
|
// transparency animation is at work
|
||||||
|
if (gl_FrontMaterial.diffuse.a < 1.0)
|
||||||
|
alpha = gl_FrontMaterial.diffuse.a;
|
||||||
|
else
|
||||||
|
alpha = 1.0;
|
||||||
|
|
||||||
|
// Vertex in eye coordinates
|
||||||
|
vec3 vertVec = ecPosition.xyz;
|
||||||
|
vViewVec.x = dot(t, vertVec);
|
||||||
|
vViewVec.y = dot(b, vertVec);
|
||||||
|
vViewVec.z = dot(n, vertVec);
|
||||||
|
|
||||||
|
// calculate the reflection vector
|
||||||
|
vec4 reflect_eye = vec4(reflect(vertVec, VNormal), 0.0);
|
||||||
|
vec3 reflVec_stat = normalize(gl_ModelViewMatrixInverse * reflect_eye).xyz;
|
||||||
|
if (refl_dynamic > 0){
|
||||||
|
//prepare rotation matrix
|
||||||
|
mat4 RotMatPR;
|
||||||
|
mat4 RotMatH;
|
||||||
|
float _roll = roll;
|
||||||
|
if (_roll>90.0 || _roll < -90.0)
|
||||||
|
{
|
||||||
|
_roll = -_roll;
|
||||||
|
}
|
||||||
|
float cosRx = cos(radians(_roll));
|
||||||
|
float sinRx = sin(radians(_roll));
|
||||||
|
float cosRy = cos(radians(-pitch));
|
||||||
|
float sinRy = sin(radians(-pitch));
|
||||||
|
float cosRz = cos(radians(hdg));
|
||||||
|
float sinRz = sin(radians(hdg));
|
||||||
|
rotationMatrixPR(sinRx, cosRx, sinRy, cosRy, RotMatPR);
|
||||||
|
rotationMatrixH(sinRz, cosRz, RotMatH);
|
||||||
|
vec3 reflVec_dyn = (RotMatH * (RotMatPR * normalize(gl_ModelViewMatrixInverse * reflect_eye))).xyz;
|
||||||
|
|
||||||
|
reflVec = reflVec_dyn;
|
||||||
|
} else {
|
||||||
|
reflVec = reflVec_stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rembrandt_enabled < 1){
|
||||||
|
gl_FrontColor = gl_FrontMaterial.emission + vec4(1.0,1.0,1.0,1.0)
|
||||||
|
* (gl_LightModel.ambient + gl_LightSource[0].ambient);
|
||||||
|
} else {
|
||||||
|
gl_FrontColor = vec4(1.0,1.0,1.0,1.0);
|
||||||
|
}
|
||||||
|
gl_Position = gl_ModelViewProjectionMatrix * vec4(rawpos,1.0);
|
||||||
|
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
|
||||||
|
}
|
Loading…
Reference in a new issue