Merge branch 'master' of \New Git\fgdata
This commit is contained in:
commit
1416cf3bed
4 changed files with 86 additions and 117 deletions
|
@ -7,7 +7,6 @@
|
||||||
<depth-factor type="float">0.008</depth-factor>
|
<depth-factor type="float">0.008</depth-factor>
|
||||||
<night-color type="vec3d">0.75 0.59 0.05</night-color>
|
<night-color type="vec3d">0.75 0.59 0.05</night-color>
|
||||||
<quality-level><use>/sim/rendering/quality-level</use></quality-level>
|
<quality-level><use>/sim/rendering/quality-level</use></quality-level>
|
||||||
<max-lod-level>10</max-lod-level>
|
|
||||||
</parameters>
|
</parameters>
|
||||||
<generate>
|
<generate>
|
||||||
<normal type="int">15</normal>
|
<normal type="int">15</normal>
|
||||||
|
@ -69,24 +68,12 @@
|
||||||
<filter><use>texture[2]/filter</use></filter>
|
<filter><use>texture[2]/filter</use></filter>
|
||||||
<wrap-s><use>texture[2]/wrap-s</use></wrap-s>
|
<wrap-s><use>texture[2]/wrap-s</use></wrap-s>
|
||||||
<wrap-t><use>texture[2]/wrap-t</use></wrap-t>
|
<wrap-t><use>texture[2]/wrap-t</use></wrap-t>
|
||||||
<internal-format><use>texture[2]/internal-format</use></internal-format>
|
<internal-format>
|
||||||
|
<use>texture[2]/internal-format</use>
|
||||||
|
</internal-format>
|
||||||
</texture-unit>
|
</texture-unit>
|
||||||
<texture-unit>
|
<texture-unit>
|
||||||
<unit>2</unit>
|
<unit>2</unit>
|
||||||
<image><use>texture[2]/image</use></image>
|
|
||||||
<filter>nearest-mipmap-nearest</filter>
|
|
||||||
<wrap-s><use>texture[2]/wrap-s</use></wrap-s>
|
|
||||||
<wrap-t><use>texture[2]/wrap-t</use></wrap-t>
|
|
||||||
<internal-format><use>texture[2]/internal-format</use></internal-format>
|
|
||||||
<mipmap-control>
|
|
||||||
<function-r>average</function-r>
|
|
||||||
<function-g>average</function-g>
|
|
||||||
<function-b>average</function-b>
|
|
||||||
<function-a>min</function-a>
|
|
||||||
</mipmap-control>
|
|
||||||
</texture-unit>
|
|
||||||
<texture-unit>
|
|
||||||
<unit>3</unit>
|
|
||||||
<type>noise</type>
|
<type>noise</type>
|
||||||
</texture-unit>
|
</texture-unit>
|
||||||
<program>
|
<program>
|
||||||
|
@ -115,15 +102,10 @@
|
||||||
<type>sampler-2d</type>
|
<type>sampler-2d</type>
|
||||||
<value type="int">1</value>
|
<value type="int">1</value>
|
||||||
</uniform>
|
</uniform>
|
||||||
<uniform>
|
|
||||||
<name>QDMTex</name>
|
|
||||||
<type>sampler-2d</type>
|
|
||||||
<value type="int">2</value>
|
|
||||||
</uniform>
|
|
||||||
<uniform>
|
<uniform>
|
||||||
<name>NoiseTex</name>
|
<name>NoiseTex</name>
|
||||||
<type>sampler-3d</type>
|
<type>sampler-3d</type>
|
||||||
<value type="int">3</value>
|
<value type="int">2</value>
|
||||||
</uniform>
|
</uniform>
|
||||||
<uniform>
|
<uniform>
|
||||||
<name>depth_factor</name>
|
<name>depth_factor</name>
|
||||||
|
@ -150,11 +132,6 @@
|
||||||
<type>float</type>
|
<type>float</type>
|
||||||
<value><use>snow-level</use></value>
|
<value><use>snow-level</use></value>
|
||||||
</uniform>
|
</uniform>
|
||||||
<uniform>
|
|
||||||
<name>max_lod_level</name>
|
|
||||||
<type>float</type>
|
|
||||||
<value><use>max-lod-level</use></value>
|
|
||||||
</uniform>
|
|
||||||
</pass>
|
</pass>
|
||||||
</technique>
|
</technique>
|
||||||
</PropertyList>
|
</PropertyList>
|
||||||
|
|
|
@ -2,15 +2,9 @@
|
||||||
// Licence: GPL v2
|
// Licence: GPL v2
|
||||||
// Author: Frederic Bouvier.
|
// Author: Frederic Bouvier.
|
||||||
// Adapted from the paper by F. Policarpo et al. : Real-time Relief Mapping on Arbitrary Polygonal Surfaces
|
// Adapted from the paper by F. Policarpo et al. : Real-time Relief Mapping on Arbitrary Polygonal Surfaces
|
||||||
// Adapted from the paper and sources by M. Drobot in GPU Pro : Quadtree Displacement Mapping with Height Blending
|
|
||||||
|
|
||||||
#version 120
|
#version 120
|
||||||
|
|
||||||
#define TEXTURE_MIP_LEVELS 10
|
|
||||||
#define TEXTURE_PIX_COUNT 1024 //pow(2,TEXTURE_MIP_LEVELS)
|
|
||||||
#define BINARY_SEARCH_COUNT 10
|
|
||||||
#define BILINEAR_SMOOTH_FACTOR 2.0
|
|
||||||
|
|
||||||
varying vec4 rawpos;
|
varying vec4 rawpos;
|
||||||
varying vec4 ecPosition;
|
varying vec4 ecPosition;
|
||||||
varying vec3 VNormal;
|
varying vec3 VNormal;
|
||||||
|
@ -22,7 +16,6 @@ varying vec4 constantColor;
|
||||||
uniform sampler3D NoiseTex;
|
uniform sampler3D NoiseTex;
|
||||||
uniform sampler2D BaseTex;
|
uniform sampler2D BaseTex;
|
||||||
uniform sampler2D NormalTex;
|
uniform sampler2D NormalTex;
|
||||||
uniform sampler2D QDMTex;
|
|
||||||
uniform float depth_factor;
|
uniform float depth_factor;
|
||||||
uniform float tile_size;
|
uniform float tile_size;
|
||||||
uniform float quality_level; // From /sim/rendering/quality-level
|
uniform float quality_level; // From /sim/rendering/quality-level
|
||||||
|
@ -30,103 +23,52 @@ uniform float snowlevel; // From /sim/rendering/snow-level-m
|
||||||
uniform vec3 night_color;
|
uniform vec3 night_color;
|
||||||
|
|
||||||
const float scale = 1.0;
|
const float scale = 1.0;
|
||||||
int GlobalIterationCount = 0;
|
int linear_search_steps = 10;
|
||||||
int gIterationCap = 64;
|
|
||||||
|
|
||||||
void QDM(inout vec3 p, inout vec3 v)
|
float ray_intersect(sampler2D reliefMap, vec2 dp, vec2 ds)
|
||||||
{
|
{
|
||||||
const int MAX_LEVEL = TEXTURE_MIP_LEVELS;
|
float size = 1.0 / float(linear_search_steps);
|
||||||
const float NODE_COUNT = TEXTURE_PIX_COUNT;
|
float depth = 0.0;
|
||||||
const float TEXEL_SPAN_HALF = 1.0 / NODE_COUNT / 2.0;
|
float best_depth = 1.0;
|
||||||
|
|
||||||
float fDeltaNC = TEXEL_SPAN_HALF * depth_factor;
|
for(int i = 0; i < linear_search_steps - 1; ++i)
|
||||||
|
|
||||||
vec3 p2 = p;
|
|
||||||
float level = MAX_LEVEL;
|
|
||||||
vec2 dirSign = (sign(v.xy) + 1.0) * 0.5;
|
|
||||||
GlobalIterationCount = 0;
|
|
||||||
float d = 0.0;
|
|
||||||
|
|
||||||
while (level >= 0.0 && GlobalIterationCount < gIterationCap)
|
|
||||||
{
|
{
|
||||||
vec4 uv = vec4(p2.xyz, level);
|
depth += size;
|
||||||
d = texture2DLod(QDMTex, uv.xy, uv.w).w;
|
float t = step(0.95, texture2D(reliefMap, dp + ds * depth).a);
|
||||||
|
if(best_depth > 0.996)
|
||||||
if (d > p2.z)
|
if(depth >= t)
|
||||||
{
|
best_depth = depth;
|
||||||
//predictive point of ray traversal
|
|
||||||
vec3 tmpP2 = p + v * d;
|
|
||||||
|
|
||||||
//current node count
|
|
||||||
float nodeCount = pow(2.0, (MAX_LEVEL - level));
|
|
||||||
//current and predictive node ID
|
|
||||||
vec4 nodeID = floor(vec4(p2.xy, tmpP2.xy)*nodeCount);
|
|
||||||
|
|
||||||
//check if we are crossing the current cell
|
|
||||||
if (nodeID.x != nodeID.z || nodeID.y != nodeID.w)
|
|
||||||
{
|
|
||||||
//calculate distance to nearest bound
|
|
||||||
vec2 a = p2.xy - p.xy;
|
|
||||||
vec2 p3 = (nodeID.xy + dirSign) / nodeCount;
|
|
||||||
vec2 b = p3.xy - p.xy;
|
|
||||||
|
|
||||||
vec2 dNC = (b.xy * p2.z) / a.xy;
|
|
||||||
//take the nearest cell
|
|
||||||
d = min(d,min(dNC.x, dNC.y))+fDeltaNC;
|
|
||||||
|
|
||||||
level++;
|
|
||||||
|
|
||||||
//use additional convergence speed-up
|
|
||||||
#ifdef USE_QDM_ASCEND_INTERVAL
|
|
||||||
if(frac(level*0.5) > EPSILON)
|
|
||||||
level++;
|
|
||||||
#elseif USE_QDM_ASCEND_CONST
|
|
||||||
level++;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
p2 = p + v * d;
|
depth = best_depth;
|
||||||
|
|
||||||
|
const int binary_search_steps = 5;
|
||||||
|
|
||||||
|
for(int i = 0; i < binary_search_steps; ++i)
|
||||||
|
{
|
||||||
|
size *= 0.5;
|
||||||
|
float t = step(0.95, texture2D(reliefMap, dp + ds * depth).a);
|
||||||
|
if(depth >= t)
|
||||||
|
{
|
||||||
|
best_depth = depth;
|
||||||
|
depth -= 2.0 * size;
|
||||||
}
|
}
|
||||||
level--;
|
depth += size;
|
||||||
GlobalIterationCount++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
return(best_depth);
|
||||||
// Manual Bilinear filtering
|
|
||||||
//
|
|
||||||
float rayLength = length(p2.xy - p.xy) + fDeltaNC;
|
|
||||||
|
|
||||||
float dA = p2.z * (rayLength - BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength;
|
|
||||||
float dB = p2.z * (rayLength + BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength;
|
|
||||||
|
|
||||||
vec4 p2a = vec4(p + v * dA, 0.0);
|
|
||||||
vec4 p2b = vec4(p + v * dB, 0.0);
|
|
||||||
dA = texture2DLod(NormalTex, p2a.xy, p2a.w).w;
|
|
||||||
dB = texture2DLod(NormalTex, p2b.xy, p2b.w).w;
|
|
||||||
|
|
||||||
dA = abs(p2a.z - dA);
|
|
||||||
dB = abs(p2b.z - dB);
|
|
||||||
|
|
||||||
p2 = mix(p2a.xyz, p2b.xyz, dA / (dA + dB));
|
|
||||||
|
|
||||||
p = p2;
|
|
||||||
}
|
|
||||||
|
|
||||||
float ray_intersect(vec2 dp, vec2 ds)
|
|
||||||
{
|
|
||||||
vec3 p = vec3( dp, 0.0 );
|
|
||||||
vec3 v = vec3( ds, 1.0 );
|
|
||||||
QDM( p, v );
|
|
||||||
return p.z;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void main (void)
|
void main (void)
|
||||||
{
|
{
|
||||||
|
if ( quality_level >= 3.5 ) {
|
||||||
|
linear_search_steps = 20;
|
||||||
|
}
|
||||||
vec3 ecPos3 = ecPosition.xyz / ecPosition.w;
|
vec3 ecPos3 = ecPosition.xyz / ecPosition.w;
|
||||||
vec3 V = normalize(ecPos3);
|
vec3 V = normalize(ecPos3);
|
||||||
vec3 s = vec3(dot(V, VTangent), dot(V, VBinormal), dot(VNormal, -V));
|
vec3 s = vec3(dot(V, VTangent), dot(V, VBinormal), dot(VNormal, -V));
|
||||||
vec2 ds = s.xy * depth_factor / s.z;
|
vec2 ds = s.xy * depth_factor / s.z;
|
||||||
vec2 dp = gl_TexCoord[0].st - ds;
|
vec2 dp = gl_TexCoord[0].st - ds;
|
||||||
float d = ray_intersect(dp, ds);
|
float d = ray_intersect(NormalTex, dp, ds);
|
||||||
|
|
||||||
vec2 uv = dp + ds * d;
|
vec2 uv = dp + ds * d;
|
||||||
vec3 N = texture2D(NormalTex, uv).xyz * 2.0 - 1.0;
|
vec3 N = texture2D(NormalTex, uv).xyz * 2.0 - 1.0;
|
||||||
|
@ -147,7 +89,7 @@ void main (void)
|
||||||
vec3 sl = normalize( vec3( dot( l, VTangent ), dot( l, VBinormal ), dot( -l, VNormal ) ) );
|
vec3 sl = normalize( vec3( dot( l, VTangent ), dot( l, VBinormal ), dot( -l, VNormal ) ) );
|
||||||
ds = sl.xy * depth_factor / sl.z;
|
ds = sl.xy * depth_factor / sl.z;
|
||||||
dp -= ds * d;
|
dp -= ds * d;
|
||||||
float dl = ray_intersect(dp, ds);
|
float dl = ray_intersect(NormalTex, dp, ds);
|
||||||
if ( dl < d - 0.05 )
|
if ( dl < d - 0.05 )
|
||||||
shadow_factor = dot( constantColor.xyz, vec3( 1.0, 1.0, 1.0 ) ) * 0.25;
|
shadow_factor = dot( constantColor.xyz, vec3( 1.0, 1.0, 1.0 ) ) * 0.25;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,4 +71,54 @@
|
||||||
<stretch>true</stretch>
|
<stretch>true</stretch>
|
||||||
</empty>
|
</empty>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
|
<group>
|
||||||
|
<layout>hbox</layout>
|
||||||
|
<default-padding>6</default-padding>
|
||||||
|
<empty>
|
||||||
|
<stretch>true</stretch>
|
||||||
|
</empty>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<legend>OK</legend>
|
||||||
|
<default>true</default>
|
||||||
|
<equal>true</equal>
|
||||||
|
<binding>
|
||||||
|
<command>dialog-apply</command>
|
||||||
|
</binding>
|
||||||
|
<binding>
|
||||||
|
<command>dialog-close</command>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<legend>Apply</legend>
|
||||||
|
<equal>true</equal>
|
||||||
|
<binding>
|
||||||
|
<command>dialog-apply</command>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<legend>Reset</legend>
|
||||||
|
<equal>true</equal>
|
||||||
|
<binding>
|
||||||
|
<command>dialog-update</command>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button>
|
||||||
|
<legend>Cancel</legend>
|
||||||
|
<equal>true</equal>
|
||||||
|
<key>Esc</key>
|
||||||
|
<binding>
|
||||||
|
<command>dialog-close</command>
|
||||||
|
</binding>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<empty>
|
||||||
|
<stretch>true</stretch>
|
||||||
|
</empty>
|
||||||
|
</group>
|
||||||
|
|
||||||
</PropertyList>
|
</PropertyList>
|
|
@ -457,9 +457,9 @@
|
||||||
</menu>
|
</menu>
|
||||||
|
|
||||||
<menu>
|
<menu>
|
||||||
<label>ATC/AI</label>
|
<label>AI</label>
|
||||||
<item>
|
<item>
|
||||||
<label>ATC Options</label>
|
<label>AI Options</label>
|
||||||
<binding>
|
<binding>
|
||||||
<command>dialog-show</command>
|
<command>dialog-show</command>
|
||||||
<dialog-name>ai</dialog-name>
|
<dialog-name>ai</dialog-name>
|
||||||
|
|
Loading…
Reference in a new issue