Calculate specular lighting correctly

Since the lighting calculations are done in object space, the vector
from the object to the viewer also needs to be transformed to object
space.
This commit is contained in:
Martin Storsjo
2009-08-11 18:01:14 +02:00
committed by Mathias Agopian
parent 4f31af9346
commit c0dea96491
2 changed files with 9 additions and 3 deletions

View File

@ -287,6 +287,7 @@ struct light_t {
vec4_t normalizedObjPosition;
vec4_t spotDir;
vec4_t normalizedSpotDir;
vec4_t objViewer;
GLfixed spotExp;
GLfixed spotCutoff;
GLfixed spotCutoffCosine;

View File

@ -216,6 +216,8 @@ static inline void light_picker(ogles_context_t* c)
static inline void validate_light_mvi(ogles_context_t* c)
{
uint32_t en = c->lighting.enabledLights;
// Vector from object to viewer, in eye coordinates
const vec4_t eyeViewer = { 0, 0, 0x1000, 0 };
while (en) {
const int i = 31 - gglClz(en);
en &= ~(1<<i);
@ -223,6 +225,9 @@ static inline void validate_light_mvi(ogles_context_t* c)
c->transforms.mvui.point4(&c->transforms.mvui,
&l.objPosition, &l.position);
vnorm3(l.normalizedObjPosition.v, l.objPosition.v);
c->transforms.mvui.point4(&c->transforms.mvui,
&l.objViewer, &eyeViewer);
vnorm3(l.objViewer.v, l.objViewer.v);
}
}
@ -379,9 +384,9 @@ void lightVertex(ogles_context_t* c, vertex_t* v)
// specular
if (ggl_unlikely(s && l.implicitSpecular.v[3])) {
vec4_t h;
h.x = d.x;
h.y = d.y;
h.z = d.z + 0x10000;
h.x = d.x + l.objViewer.x;
h.y = d.y + l.objViewer.y;
h.z = d.z + l.objViewer.z;
vnorm3(h.v, h.v);
s = dot3(n.v, h.v);
s = (s<0) ? (twoSide?(-s):0) : s;