diff options
author | Martin Storsjo <martin@martin.st> | 2009-08-11 18:01:14 +0200 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-08-25 18:35:54 -0700 |
commit | c0dea964913268bd64009e657635e617f3e0c21c (patch) | |
tree | 379fdde7e66d3b8ab88348e0b7138f1ab6ed5970 | |
parent | 4f31af9346b818c8ef05a63e15e9170a7c6131e4 (diff) | |
download | frameworks_base-c0dea964913268bd64009e657635e617f3e0c21c.zip frameworks_base-c0dea964913268bd64009e657635e617f3e0c21c.tar.gz frameworks_base-c0dea964913268bd64009e657635e617f3e0c21c.tar.bz2 |
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.
-rw-r--r-- | include/private/opengles/gl_context.h | 1 | ||||
-rw-r--r-- | opengl/libagl/light.cpp | 11 |
2 files changed, 9 insertions, 3 deletions
diff --git a/include/private/opengles/gl_context.h b/include/private/opengles/gl_context.h index 523aed0..67c2dd8 100644 --- a/include/private/opengles/gl_context.h +++ b/include/private/opengles/gl_context.h @@ -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; diff --git a/opengl/libagl/light.cpp b/opengl/libagl/light.cpp index 8ae32cc0f..f211bca 100644 --- a/opengl/libagl/light.cpp +++ b/opengl/libagl/light.cpp @@ -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; |