I'm currently writing an engine for iPHone 3GS and diving in openGL es 2.0 made me realize how weak my matrices kung-ku is.

I've followed the shaders example here : http://www.ozone3d.net/tutorials/bump_mapping_p4.php

Code :[Vertex_Shader] varying vec3 lightVec; varying vec3 eyeVec; varying vec2 texCoord; attribute vec3 vTangent; void main(void) { gl_Position = ftransform(); texCoord = gl_MultiTexCoord0.xy; vec3 n = normalize(gl_NormalMatrix * gl_Normal); vec3 t = normalize(gl_NormalMatrix * vTangent); vec3 b = cross(n, t); vec3 vVertex = vec3(gl_ModelViewMatrix * gl_Vertex); vec3 tmpVec = gl_LightSource[0].position.xyz - vVertex; lightVec.x = dot(tmpVec, t); lightVec.y = dot(tmpVec, b); lightVec.z = dot(tmpVec, n); tmpVec = -vVertex; eyeVec.x = dot(tmpVec, t); eyeVec.y = dot(tmpVec, b); eyeVec.z = dot(tmpVec, n); }

I have now a georgous iphone bumpMapping support for iphone 3GS but:

1/ It looks like the shader build a matrix cameraspace->tangentspace, instead of providing light position in model space and perform bumpMapping directly, this seems unefficient.

2/ Before modifying to the much faster gpwiki method ( http://gpwiki.org/index.php/OpenGL:T...L_Bump_Mapping ), I'm trying to undestand exactly what is going on:

Code :vec3 n = normalize(gl_NormalMatrix * gl_Normal); vec3 t = normalize(gl_NormalMatrix * vTangent); vec3 b = cross(n, t);

This is basically a matrix*matrix operation.

gl_NormalMatrix is a modelspace->cameraspace,

gl_Normal and vTangent are two compoennt of the tangent space matrix, which perform a modelspace->tangentspace transformation.

Thing I don't get #1:

How comes doing:

modelspace->cameraspace * modelspace->tangentspace

builds a matrix that allow to do cameraspace--> tangentspace

Thing I don't get #2:

When the light vector is rotated, it's not done via a Matrix*Vector but the opposite: Vector*Matrix.

Any help ?