below, one can see that itās like a whole shader has been created from two diferent techniques
WARNING: Bad compile of:
1 #version 150 core
2
3 uniform vec3 m_LightPosition;
4 uniform mat3 g_NormalMatrix;
5 uniform mat4 g_ViewMatrix;
6 uniform mat4 g_WorldViewMatrix;
7 uniform mat4 g_WorldMatrix;
8 uniform vec3 g_CameraPosition;
9 uniform mat4 g_WorldViewProjectionMatrix;
10
11 in vec3 inNormal;
12 in vec4 inTangent;
13 in vec2 inTexCoord;
14 in vec4 inPosition;
15
16 out vec3 NormalsMapVert_modelPosition;
17 out vec2 MetalVert_texCoord;
18 out vec4 NormalsMapVert_lightDir;
19 out vec3 NormalsMapVert_eyeVec;
20 out vec4 NormalsMapVert_debug;
21 out vec4 NormalsMapVert_v;
22 out vec3 NormalsMapVert_normal;
23
24 uniform vec4 g_LightPosition; // hack
25 uniform vec4 g_LightColor; // hack
26
27 // this funciton does some math tricks to compute the light dirrection and attenuation.
28 // Attenuation just resolves to 0 if it's a directional light or a spot light.
29 // Then in the lighting.frag, we compute the spotfalloff for the spot light.
30 // The angle cosines are packed into the 4th channel of the lightDirection.
31 // The spot falloff also resolves to 0 for a directional light.
32
33 void lightComputeDir(in vec3 worldPos, in vec4 color, in vec4 position, out vec4 lightDir){
34 // 0 = Directional, 1 = Point, 2 = Spot
35 float posLight = step(0.5, color.w); //Returns 0.0 if w < 0.5, otherwise it returns 1.0.
36 // sign : Returns 1.0 if x > 0, 0.0 if x = 0, or ā1.0 if x < 0.
37 vec3 tempVec = position.xyz * sign(posLight - 0.5) - (worldPos * posLight);
38 vec3 lightVec = tempVec;
39 #ifdef ATTENUATION
40 float dist = length(tempVec);
41 lightDir.w = clamp(1.0 - position.w * dist * posLight, 0.0, 1.0);
42 lightDir.xyz = tempVec / vec3(dist);
43 #else
44 lightDir = vec4(normalize(tempVec), 1.0);
45 #endif
46 }
47
48
49
50 void main(){
51 vec4 Global_position = inPosition;
52
53 //NormalsMapVert : Begin
54 vec3 NormalsMapVert_normalIn = inNormal;
55 vec4 NormalsMapVert_tangentIn = inTangent;
56 NormalsMapVert_modelPosition = Global_position.xyz;
57
58 NormalsMapVert_normal = normalize(g_NormalMatrix * NormalsMapVert_normalIn);
59 vec3 tangent = normalize(g_NormalMatrix * NormalsMapVert_tangentIn.xyz);
60 vec3 binormal = cross(NormalsMapVert_normal, tangent);
61
62 //tbnMat matrix (view space to tangent space)
63 // The multiplication of the binormal is because some binormals need to be inverted depending on the triangle.
64 mat3 tbnMat = mat3(tangent, binormal * NormalsMapVert_tangentIn.w, NormalsMapVert_normal);
65
66 // Get the position in eye coordinates
67 NormalsMapVert_v = g_WorldViewMatrix * vec4(NormalsMapVert_modelPosition,1.0);
68
69 //vec4 _lightColor=vec4(1,1,1,1);
70 //vec4 _lightPosition=vec4(m_LightPosition,1);
71 vec4 _lightColor=g_LightColor;
72 vec4 _lightPosition=g_LightPosition;
73
74 // light pos (world->view)
75 vec4 vLightPosition=vec4(g_ViewMatrix*vec4(_lightPosition.xyz,clamp(_lightColor.w,0.0,1.0)));
76 vLightPosition.w=_lightColor.w;
77
78 lightComputeDir(NormalsMapVert_v.xyz, _lightColor, vLightPosition, NormalsMapVert_lightDir);
79
80 //we actually need to mult by the invert the matrix, to go from tangent space to view space
81 //with a normalized rotation matrix one can actually just transpose it instead of inverting it.
82 //=> mat * vec = vec * transpose(mat)
83 NormalsMapVert_lightDir = vec4(NormalsMapVert_lightDir.xyz*tbnMat,1);
84 NormalsMapVert_eyeVec = normalize(-NormalsMapVert_v.xyz)*tbnMat;
85
86 //NormalsMapVert : End
87
88 //MetalVert : Begin
89 vec3 MetalVert_modelPosition = Global_position.xyz;
90 MetalVert_texCoord = inTexCoord;
91 vec4 MetalVert_projPosition;
92
93 MetalVert_projPosition = g_WorldViewProjectionMatrix * vec4(MetalVert_modelPosition, 1.0); //g_WorldViewProjectionMatrix=gl_ModelViewProjectionMatrix
94 Global_position = MetalVert_projPosition;
95 //MetalVert : End
96
97 //MetalVertGlow : Begin
98 vec3 MetalVertGlow_modelPosition = Global_position.xyz;
99 MetalVertGlow_texCoord = inTexCoord;
100 vec4 MetalVertGlow_projPosition;
101
102 MetalVertGlow_projPosition = g_WorldViewProjectionMatrix * vec4(MetalVertGlow_modelPosition, 1.0); //g_WorldViewProjectionMatrix=gl_ModelViewProjectionMatrix
103 Global_position = MetalVertGlow_projPosition;
104 //MetalVertGlow : End
105 gl_Position = Global_position;
106 }
avr. 13, 2015 6:34:34 PM com.jme3.app.Application handleError
SEVERE: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Default.vert, defines, type=Vertex, language=GLSL150] error:0(99) : error C1008: undefined variable "MetalVertGlow_texCoord"
MaterialDef Simple {
MaterialParameters {
Texture2D GlowMap
Texture2D DiffuseMap
Texture2D ReflectionMap
Texture2D NormalsMap
TextureCubeMap RefractionMap
Vector3 LightPosition
Color SceneAmbient
Color Ambient
Color LightAmbient
Color LightDiffuse
Color Specular
Color LightSpecular
Float Shininess
Boolean Blinn
Float ReflectionAmount
Vector3 Time
Vector3 NoiseScale
Int NoiseOctaves
Float TransitionPercent
Float GlobalAlpha
}
Technique {
LightMode MultiPass
Defines {
}
WorldParameters {
WorldViewProjectionMatrix
NormalMatrix
WorldViewMatrix
WorldMatrix
ViewMatrix
CameraPosition
}
VertexShaderNodes {
ShaderNode NormalsMapVert {
Definition : NormalsMapVert : Shaders/NormalsMap/NormalsMapVert.j3sn
//Condition : NormalsMap
InputMappings {
lightPosition = MatParam.LightPosition
normalIn = Attr.inNormal
tangentIn = Attr.inTangent
modelPosition = Global.position.xyz
normalMatrix = WorldParam.NormalMatrix
viewMatrix= WorldParam.ViewMatrix
worldViewMatrix = WorldParam.WorldViewMatrix
worldMatrix=WorldParam.WorldMatrix
cameraPosition=WorldParam.CameraPosition
}
OutputMappings {
// normal, lightDir, eyeVec
}
}
ShaderNode MetalVert {
Definition : MetalVert : Shaders/Metal/MetalVert.j3sn
InputMappings {
worldViewProjectionMatrix = WorldParam.WorldViewProjectionMatrix
modelPosition = Global.position.xyz
texCoord = Attr.inTexCoord
}
OutputMappings {
Global.position = projPosition
}
}
}
FragmentShaderNodes {
ShaderNode Simplex3GrayFrag {
Definition : Simplex3GrayFrag : Shaders/Simplex/Simplex3GrayFrag.j3sn
InputMappings {
texCoord = NormalsMapVert.modelPosition.xyz
time = MatParam.Time
scale = MatParam.NoiseScale
octaves = MatParam.NoiseOctaves
}
}
ShaderNode PrePhongTransientFragNormals {
Definition : PrePhongTransientFrag : Shaders/NormalsMap/PrePhongTransientFrag.j3sn
//Condition : NormalsMap
InputMappings {
simplexColor = Simplex3GrayFrag.simplexColor
transitionPercent = MatParam.TransitionPercent
texCoord = MetalVert.texCoord
normalsMap = MatParam.NormalsMap
lightDirIn = NormalsMapVert.lightDir
eyeVecIn = NormalsMapVert.eyeVec
}
}
ShaderNode PhongFragNormals {
Definition : PhongFrag : Shaders/Phong/PhongFrag.j3sn
//Condition : NormalsMap
InputMappings {
normal = PrePhongTransientFragNormals.normal
lightDir = PrePhongTransientFragNormals.lightDir
eyeVec = PrePhongTransientFragNormals.eyeVec
blinn = MatParam.Blinn
sceneAmbient = MatParam.SceneAmbient
ambient = MatParam.Ambient
diffuseMap = MatParam.DiffuseMap
specular = MatParam.Specular
shininess = MatParam.Shininess
lightAmbient = MatParam.LightAmbient
lightDiffuse = MatParam.LightDiffuse
lightSpecular = MatParam.LightSpecular
texCoord = MetalVert.texCoord
debug=NormalsMapVert.debug
}
}
ShaderNode ReflectionFrag {
Definition : ReflectionFrag : Shaders/Reflection/ReflectionFrag.j3sn
InputMappings {
v = NormalsMapVert.v
normal = NormalsMapVert.normal
lambertTerm = PhongFragNormals.lambertTerm
reflectionMap = MatParam.ReflectionMap
}
}
ShaderNode MetalFragNormals {
Definition : MetalFrag : Shaders/Metal/MetalFrag.j3sn
//Condition : NormalsMap
InputMappings {
lightingColor = PhongFragNormals.outColor
reflectionColor = ReflectionFrag.outColor
reflectionAmount = MatParam.ReflectionAmount
}
OutputMappings {
Global.color = outColor
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Technique Glow
{
Defines {
}
WorldParameters {
WorldViewProjectionMatrix
NormalMatrix
WorldViewMatrix
WorldMatrix
ViewMatrix
CameraPosition
}
VertexShaderNodes {
ShaderNode MetalVertGlow {
Definition : MetalVert : Shaders/Metal/MetalVert.j3sn
InputMappings {
worldViewProjectionMatrix = WorldParam.WorldViewProjectionMatrix
modelPosition = Global.position.xyz
texCoord = Attr.inTexCoord
}
OutputMappings {
Global.position = projPosition
}
}
}
FragmentShaderNodes {
ShaderNode Simplex3GrayFrag2 {
Definition : Simplex3GrayFrag : Shaders/Simplex/Simplex3GrayFrag.j3sn
InputMappings {
texCoord = NormalsMapVert.modelPosition.xyz
time = MatParam.Time
scale = MatParam.NoiseScale
octaves = MatParam.NoiseOctaves
}
}
ShaderNode GlowTransientFrag {
Definition : GlowTransientFrag : Shaders/Unshaded/GlowTransientFrag.j3sn
//Condition : NormalsMap
InputMappings {
simplexColor = Simplex3GrayFrag2.simplexColor
transitionPercent = MatParam.TransitionPercent
glowMap = MatParam.GlowMap
texCoord = MetalVertGlow.texCoord
globalAlpha= MatParam.GlobalAlpha
}
OutputMappings {
Global.color = outColor
}
}
}
}
}