-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbasic.vert
63 lines (47 loc) · 1.66 KB
/
basic.vert
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
#version 440
in vec4 vVertex;
uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat3 normalMatrix;
uniform vec3 vLightPosition;
double x = 6378137.0;
double y = 6378137.0;
double z = 6356752.314245;
vec3 vTangent = vec3(1.0, 0.0, 0.0);
vec3 vEyeNormal;
smooth out vec3 vVaryingLightDir;
smooth out vec2 coord;
out vec3 worldPosition;
vec3 GeodeticSurfaceNormal(vec3 positionOnEllipsoid, vec3 oneOverEllipsoidRadiiSquared)
{
return normalize(positionOnEllipsoid * oneOverEllipsoidRadiiSquared);
}
vec2 ComputeTextureCoordinates(vec3 normal)
{
double PI = 3.14159265358979323846;
double og_oneOverTwoPi = 1.0 / (2.0 * PI);
double og_oneOverPi = 1.0 / PI;
return vec2(atan(normal.y, normal.x) * og_oneOverTwoPi + 0.5, asin(normal.z) * og_oneOverPi + 0.5);
}
void main(void)
{
vec3 u_globeOneOverRadiiSquared = vec3(1.0 / (x * x), 1.0 / (y * y), 1.0 / (z * z));
//地理法线
vec3 vNormal = GeodeticSurfaceNormal(vVertex.xyz, u_globeOneOverRadiiSquared);
//地理纹理坐标
// coord = ComputeTextureCoordinates(vNormal);
vEyeNormal = normalMatrix * vNormal;
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
vVaryingLightDir = normalize(vLightPosition - vPosition3);
//构造切平面
vec3 b, t, v;
t = normalize(normalMatrix * vTangent);
b = cross(vEyeNormal, t);
v.x = dot(vVaryingLightDir, t);
v.y = dot(vVaryingLightDir, b);
v.z = dot(vVaryingLightDir, vEyeNormal);
vVaryingLightDir = normalize(v);
gl_Position = mvpMatrix * vVertex;
worldPosition = vVertex.xyz;
}