Bump mapping example in "OpenGL Shading Language"


I follow the bump mapping example from the book “OpenGL Shading Language,” but the result looks very different from what it does in the book.

Please see the comparison here:

The left one is what I got in Shader Designer, and it does not bump :frowning: . The right one is the result in the book.

Here is the code:

varying vec3 LightDir;
varying vec3 EyeDir;

attribute vec3 Tangent;

void main()
vec3 LightPosition = vec3(0,0,0);
EyeDir = vec3(gl_ModelViewMatrix * gl_Vertex);
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;

vec3 n = normalize(gl_NormalMatrix * gl_Normal);
vec3 t = normalize(gl_NormalMatrix * Tangent);
vec3 b = cross(n, t);

vec3 v;
v.x = dot(vec3(gl_LightSource[0].position), t);
v.y = dot(vec3(gl_LightSource[0].position), b);
v.z = dot(vec3(gl_LightSource[0].position), n);
LightDir = normalize(v);

v.x = dot(EyeDir, t);
v.y = dot(EyeDir, b);
v.z = dot(EyeDir, n);
EyeDir = normalize(v);
varying vec3 LightDir;
varying vec3 EyeDir;

void main()
vec3 litColor;
vec2 c = 16.0 * gl_TexCoord[0].st;
vec2 p = fract(c) - vec2(0.5);

float d, f;
d = p.x * p.x + p.y * p.y;
f = 1.0 / sqrt(d+1.0);

if(d >= 0.15)
p = vec2(0.0); f = 1.0;

vec3 normDelta = vec3(p.x, p.y, 1.0)*f;
litColor = vec3(.7, .6, .18) * max(dot(normDelta, LightDir), 0.0);
vec3 reflectDir = reflect(LightDir, normDelta);

float spec = max(dot(EyeDir, reflectDir), 0.0);
spec = pow(spec, 6.0);
spec *= .5;

litColor = min(litColor + spec, vec3(1.0));

gl_FragColor = vec4(litColor, 1.0);

I just replaced all the uniform variables in the example to make it executable in the program Shader Designer. What is the problem?

Shader Designer comes with exactly that shader correctly implemented and working without problems. Check out the dimple.gdp shader at Shader Designer’s shaders folder.

Hi Ffelagund,

Your response is very helpful, and I got the problem.
I compare the vertex shader in both of them. In the book, it retrieves the tangent vector in the tangent space from an attribute variable, “Tangent.”

vec3 t = normalize(gl_NormalMatrix * Tangent);

In the example of Shader Designer, the tangent vector is computed by cross product a fixed vector and the normal.

vec3 t = normalize(cross(vec3(1.141, 2.78, 3.14), n));

After I copied this line from Shader Designer’s example to the book’s example, everything works great! The result is exactly the same as the picture in the book.

I am wondering is this a bug of the book or the inconsistent results for different video cards? I am using Ati 9600 mobility.

No, in this case the custom attribute ‘Tangent’ is expected to be filled in by your application.
You can do it in Shader Designer too.

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.