aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/org/jdesktop/j3d/examples/gl2es2pipeline/multitex.vert
blob: 5c25c1116a7d48c071fb290d516f6d3215846b31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// tex coord gen sample from http://www.ogre3d.org/forums/viewtopic.php?f=4&t=59737




// GL2ES2: Java3D built-in attributes, these are calculated and passsed in if declared here
attribute vec4 glVertex;
attribute vec3 glNormal;  

// GL2ES2: Java3D built-in uniforms, these are calculated and passsed in if declared here
uniform mat4 glModelViewProjectionMatrix;
uniform mat4 glModelViewMatrix;
uniform mat3 glNormalMatrix;

// Per-pixel normal (output to fragment shader)
varying vec3  Normal;

varying vec2 texCoord0;
varying vec2 texCoord1;

	//Example 8-4   Sphere Map Texture Coordinate Generation
    // position is the normalized position coordinate in eye space 
    // normal is the normalized normal coordinate in eye space 
    // returns a vec2 texture coordinate
vec2 sphere_map(vec3 position, vec3 normal)
{
    vec3 reflection = reflect(position, normal);
    float m = 2.0 * sqrt(reflection.x * reflection.x + reflection.y * reflection.y + (reflection.z + 1.0) * (reflection.z + 1.0)); 
    return vec2((reflection.x / m + 0.5), (reflection.y / m + 0.5));
}

    //Example 8-5   Cube Map Texture Coordinate Generation

    // position is the normalized position coordinate in eye space 
    // normal is the normalized normal coordinate in eye space 
    // returns the reflection vector as a vec3 texture coordinate 
vec3 cube_map(vec3 position, vec3 normal) 
{
    return reflect(position, normal);
}

//Object Linear Mapping
//When the texture generation mode is set to GL_OBJECT_LINEAR, texture coordinates are generated using the following function:
//coord = P1*X + P2*Y + P3*Z + P4*W
// The X, Y, Z, and W values are the vertex coordinates from the object being textured, and the P1–P4 values are the coefficients for a plane equation.

//For this shader in my code I have:
//Vector4f plane0S = new Vector4f(3.0f, 1.5f, 0.3f, 0.0f); //to calc coord S
//Vector4f plane0T = new Vector4f(1.0f, 2.5f, 0.24f, 0.0f); //to calc coord T
//I could hand them is as uniforms, but I choose to hard code them


vec2 object_linear(vec4 pos, vec4 planeOS, vec4 planeOT)
{
	return vec2(pos.x*planeOS.x+pos.y*planeOS.y+pos.z*planeOS.z+ pos.w*planeOS.w,pos.x*planeOT.x+pos.y*planeOT.y+pos.z*planeOT.z+pos.w*planeOT.w);
}
    
    
void main()
{
    Normal = normalize(vec3(glNormalMatrix * glNormal));

    // Transform the vertex
    gl_Position = glModelViewProjectionMatrix * glVertex;
    
    texCoord0 = object_linear(glVertex, vec4(3.0, 1.5, 0.3, 0.0),vec4(1.0, 2.5, 0.24, 0.0)); 
	texCoord1 = sphere_map(normalize(vec3(glModelViewMatrix*glVertex)), Normal);
}