Bump map shader contributed by Emilian Huminiuc. Should be inherited from to be used in models.
This commit is contained in:
parent
553d6f2c21
commit
27968d4da9
3 changed files with 210 additions and 0 deletions
104
Effects/bumpspec.eff
Normal file
104
Effects/bumpspec.eff
Normal file
|
@ -0,0 +1,104 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Bump and specular effect
|
||||
parameters :
|
||||
texture[0] -> colormap
|
||||
texture[2] -> normal map + specularity in alpha channel
|
||||
|
||||
eg :
|
||||
in model.xml :
|
||||
<effect>
|
||||
<inherits-from>Aircraft/A320/Models/Effects/bumpspec</inherits-from>
|
||||
<object-name>Fuselage</object-name>
|
||||
</effect>
|
||||
|
||||
in Aircraft/A320/Models/Effects/a320_bumpspec.eff ( or whatever, private to the model )
|
||||
|
||||
<PropertyList>
|
||||
<name>Aircraft/A320/Models/Effects/a320_bumpspec</name>
|
||||
<inherits-from>Effects/bumpspec</inherits-from>
|
||||
<parameters>
|
||||
<texture n="2">
|
||||
<image>Aircraft/A320/Models/Effects/textures/a320_normals.png</image>
|
||||
<filter>linear-mipmap-linear</filter>
|
||||
<wrap-s>repeat</wrap-s>
|
||||
<wrap-t>repeat</wrap-t>
|
||||
<internal-format>normalized</internal-format>
|
||||
</texture>
|
||||
</parameters>
|
||||
</PropertyList>
|
||||
-->
|
||||
<PropertyList>
|
||||
<name>Effects/bumpspec</name>
|
||||
<inherits-from>Effects/model-default</inherits-from>
|
||||
<generate>
|
||||
<normal type="int">15</normal>
|
||||
<tangent type="int">6</tangent>
|
||||
<binormal type="int">7</binormal>
|
||||
</generate>
|
||||
<technique n="10">
|
||||
<predicate>
|
||||
<and>
|
||||
<property>/sim/rendering/shader-effects</property>
|
||||
<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>
|
||||
</and>
|
||||
</predicate>
|
||||
<pass>
|
||||
<texture-unit>
|
||||
<unit>0</unit>
|
||||
<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[1]/internal-format</use></internal-format>
|
||||
</texture-unit>
|
||||
<texture-unit>
|
||||
<unit>1</unit>
|
||||
<image><use>texture[2]/image</use></image>
|
||||
<filter><use>texture[2]/filter</use></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>
|
||||
</texture-unit>
|
||||
<program>
|
||||
<vertex-shader n="0">Shaders/bumpspec.vert</vertex-shader>
|
||||
<fragment-shader n="0">Shaders/bumpspec.frag</fragment-shader>
|
||||
<uniform>
|
||||
<name>tex_color</name>
|
||||
<type>sampler-2d</type>
|
||||
<value type="int">0</value>
|
||||
</uniform>
|
||||
<uniform>
|
||||
<name>tex_normal</name>
|
||||
<type>sampler-2d</type>
|
||||
<value type="int">1</value>
|
||||
</uniform>
|
||||
<uniform>
|
||||
<name>tex_specular</name>
|
||||
<type>sampler-2d</type>
|
||||
<value type="int">2</value>
|
||||
</uniform>
|
||||
</program>
|
||||
<uniform>
|
||||
<name>tex_color</name>
|
||||
<type>sampler-2d</type>
|
||||
<value type="int">0</value>
|
||||
</uniform>
|
||||
<uniform>
|
||||
<name>tex_normal</name>
|
||||
<type>sampler-2d</type>
|
||||
<value type="int">1</value>
|
||||
</uniform>
|
||||
</pass>
|
||||
</technique>
|
||||
</PropertyList>
|
53
Shaders/bumpspec.frag
Normal file
53
Shaders/bumpspec.frag
Normal file
|
@ -0,0 +1,53 @@
|
|||
// -*- mode: C; -*-
|
||||
// Licence: GPL v2
|
||||
// Authors: Original code by Thorsten Jordan, Luis Barrancos and others (dangerdeep.sf.net)
|
||||
// Modified by Emilian Huminiuc (emilianh@gmail.com) (i4dnf on the flightgear forums).
|
||||
// fixme: maybe lookup texmap is faster than pow(). Quick tests showed that this is not the case...
|
||||
|
||||
uniform sampler2D tex_color; // (diffuse) color map, RGB
|
||||
uniform sampler2D tex_normal; // normal map, RGB + A Specular
|
||||
|
||||
|
||||
varying vec4 ecPosition;
|
||||
varying vec3 lightdir, halfangle;
|
||||
|
||||
void main()
|
||||
{
|
||||
// get and normalize vector to light source
|
||||
vec3 L = normalize(lightdir);
|
||||
|
||||
// get and normalize normal vector from texmap
|
||||
vec4 v = texture2D(tex_normal, gl_TexCoord[0].st);
|
||||
vec3 N = normalize(vec3(v.xyz * 2.0 - 1.0));
|
||||
N.y = -N.y;
|
||||
if (!gl_FrontFacing)
|
||||
N = -N;
|
||||
|
||||
// compute specular color
|
||||
// get and normalize half angle vector
|
||||
vec3 H = normalize(halfangle);
|
||||
|
||||
// compute resulting specular color
|
||||
vec3 specular_color = vec3(gl_FrontMaterial.specular) *
|
||||
pow(max(dot(H, N), 0.0), gl_FrontMaterial.shininess);
|
||||
|
||||
// compute diffuse color
|
||||
vec3 diffuse_color = vec3(texture2D(tex_color, gl_TexCoord[0].st));
|
||||
|
||||
// handle ambient
|
||||
diffuse_color = diffuse_color * mix(max(dot(L, N), 0.0), 0.6, gl_LightSource[0].ambient.r);
|
||||
|
||||
specular_color = specular_color * v.a;
|
||||
|
||||
// final color of fragment
|
||||
vec3 final_color = clamp((diffuse_color + specular_color) * vec3(gl_LightSource[0].diffuse /*light_color*/), 0.0, 1.0);
|
||||
|
||||
float fog_factor;
|
||||
float fogCoord = ecPosition.z;
|
||||
const float LOG2 = 1.442695;
|
||||
fog_factor = exp2(-gl_Fog.density * gl_Fog.density * fogCoord * fogCoord * LOG2);
|
||||
fog_factor = clamp(fog_factor, 0.0, 1.0);
|
||||
|
||||
// output color is a mix between fog and final color
|
||||
gl_FragColor = vec4(mix(vec3(gl_Fog.color), final_color, fog_factor), 1.0);
|
||||
}
|
53
Shaders/bumpspec.vert
Normal file
53
Shaders/bumpspec.vert
Normal file
|
@ -0,0 +1,53 @@
|
|||
// -*- mode: C; -*-
|
||||
// Licence: GPL v2
|
||||
// Authors: Original code by Thorsten Jordan, Luis Barrancos and others (dangerdeep.sf.net)
|
||||
// Modified by Emilian Huminiuc (emilianh@gmail.com) (i4dnf on the flightgear forums).
|
||||
|
||||
/* input:
|
||||
gl_Vertex
|
||||
gl_Normal (tangentz)
|
||||
gl_MultiTexCoord0 (texcoord)
|
||||
tangentx_righthanded (tangentx,righthanded-factor)
|
||||
*/
|
||||
|
||||
/* can we give names to default attributes? or do we need to use named attributes for that?
|
||||
how to give named attributes with vertex buffer objects?
|
||||
we could assign them to a variable, but would that be efficient? an unnecessary copy.
|
||||
but the shader compiler should be able to optimize that...
|
||||
the way should be to use vertex attributes (together with vertex arrays or VBOs),
|
||||
that have a name and use that name here.
|
||||
until then, access sources directly or via a special variable.
|
||||
*/
|
||||
|
||||
varying vec4 ecPosition;
|
||||
varying vec3 lightdir, halfangle;
|
||||
attribute vec4 tangent, binormal;
|
||||
|
||||
void main()
|
||||
{
|
||||
ecPosition = gl_ModelViewMatrix * gl_Vertex;
|
||||
|
||||
// compute direction to light in object space (L)
|
||||
vec3 lightpos_obj = vec3(gl_ModelViewMatrixInverse * gl_LightSource[0].position);
|
||||
vec3 lightdir_obj = normalize(lightpos_obj);
|
||||
|
||||
// direction to viewer (E)
|
||||
// compute direction to viewer (E) in object space (mvinv*(0,0,0,1) - inputpos)
|
||||
vec3 viewerdir_obj = normalize(vec3(gl_ModelViewMatrixInverse[3]) - vec3(gl_Vertex));
|
||||
|
||||
// compute halfangle vector (H = ||L+E||)
|
||||
vec3 halfangle_obj = normalize(viewerdir_obj + lightdir_obj);
|
||||
|
||||
// transform light direction to tangent space
|
||||
lightdir.x = dot(tangent, lightdir_obj);
|
||||
lightdir.y = dot(binormal, lightdir_obj);
|
||||
lightdir.z = dot(gl_Normal, lightdir_obj);
|
||||
|
||||
halfangle.x = dot(tangent, halfangle_obj);
|
||||
halfangle.y = dot(binormal, halfangle_obj);
|
||||
halfangle.z = dot(gl_Normal, halfangle_obj);
|
||||
|
||||
// finally compute position
|
||||
gl_Position = ftransform();
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
|
||||
}
|
Loading…
Reference in a new issue