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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
const int MAX_LIGHTS = 8;
struct Light {
vec3 position;
vec3 color;
float intensity;
vec3 direction;
vec3 attenuation;
// float cutOffAngle;
};
uniform Light lights[MAX_LIGHTS];
uniform int lightCount;
void adsModelNormalMapped(const in vec3 vpos, const in vec3 vnormal, const in vec3 eye, const in float shininess,
const in mat3 tangentMatrix,
out vec3 diffuseColor, out vec3 specularColor)
{
diffuseColor = vec3(0.0);
specularColor = vec3(0.0);
vec3 n = normalize( vnormal );
int i;
for (i = 0; i < lightCount; ++i) {
vec3 lightDir = lights[i].direction;
float att = 1.0;
if (length( lightDir ) == 0.0) {
lightDir = lights[i].position - vpos;
if (length( lights[i].attenuation ) != 0.0) {
float dist = length(lightDir);
att = 1.0 / (lights[i].attenuation.x + lights[i].attenuation.y * dist + lights[i].attenuation.z * dist * dist);
}
}
vec3 s = normalize( tangentMatrix * lightDir );
float diffuse = max( dot( s, n ), 0.0 );
float specular = 0.0;
if (diffuse > 0.0 && shininess > 0.0) {
vec3 r = reflect( -s, n );
vec3 v = normalize( tangentMatrix * ( eye - vpos ) );
float normFactor = ( shininess + 2.0 ) / 2.0;
specular = normFactor * pow( max( dot( r, v ), 0.0 ), shininess );
}
diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
specularColor += specular;
}
}
void adsModel(const in vec3 vpos, const in vec3 vnormal, const in vec3 eye, const in float shininess,
out vec3 diffuseColor, out vec3 specularColor)
{
diffuseColor = vec3(0.0);
specularColor = vec3(0.0);
vec3 n = normalize( vnormal );
int i;
for (i = 0; i < lightCount; ++i) {
vec3 lightDir = lights[i].direction;
float att = 1.0;
if (length( lightDir ) == 0.0) {
lightDir = lights[i].position - vpos;
if (length( lights[i].attenuation ) != 0.0) {
float dist = length(lightDir);
att = 1.0 / (lights[i].attenuation.x + lights[i].attenuation.y * dist + lights[i].attenuation.z * dist * dist);
}
}
vec3 s = normalize( lightDir );
float diffuse = max( dot( s, n ), 0.0 );
float specular = 0.0;
if (diffuse > 0.0 && shininess > 0.0) {
vec3 r = reflect( -s, n );
vec3 v = normalize( eye - vpos );
float normFactor = ( shininess + 2.0 ) / 2.0;
specular = normFactor * pow( max( dot( r, v ), 0.0 ), shininess );
}
diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
specularColor += specular;
}
}
void adModel(const in vec3 vpos, const in vec3 vnormal, out vec3 diffuseColor)
{
diffuseColor = vec3(0.0);
vec3 n = normalize( vnormal );
int i;
for (i = 0; i < lightCount; ++i) {
vec3 lightDir = lights[i].direction;
float att = 1.0;
if (length( lightDir ) == 0.0) {
lightDir = lights[i].position - vpos;
if (length( lights[i].attenuation ) != 0.0) {
float dist = length(lightDir);
att = 1.0 / (lights[i].attenuation.x + lights[i].attenuation.y * dist + lights[i].attenuation.z * dist * dist);
}
}
vec3 s = normalize( lightDir );
float diffuse = max( dot( s, n ), 0.0 );
diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
}
}
|