Sign in to follow this  
Emiug

GLSL: shading models with rotation / translation

Recommended Posts

First, let me just wish you all a Happy New Year! Im currently writing a shader to shade the models in my scene, everything works fine, until i rotate the models. is there anyway of sending the models to the shader after performing the transforms? or is there something i should do in the shader to transform the vertices? Thanks in advance Emiug

Share this post


Link to post
Share on other sites
Well, you can solve your problem by two ways :

1. Calculate everything in world space (so use light * gl_ModelViewMatrix, normal * gl_ModelViewMatrix, .... - multiply everything with model view matrix)

2. Multiply your light with inverse modelview matrix of transformed model.

Share this post


Link to post
Share on other sites
For all but the most simple shaders (and possibly post-process shaders that only operate on a screen-aligned quad), you should always be multiplying your vertices by the modelview matrix. There's a GLSL function specifically for this:
gl_Position = ftransform();
It's pretty much the equivalent of multplying your untransformed vertex position by the modelview matrix, as Vilem Otte mentioned.

Share this post


Link to post
Share on other sites
Hey, thanks for the replies.
Im not sure if this is right, but my shader should look something like this?


varying vec3 lightDir;
varying vec3 eyeDir;

attribute vec3 Tangent;

uniform vec3 LightPos;

void main(void)
{
//LightPos = gl_ModelViewMatrix * vec4(LightPos, 1);

gl_Position = ftransform();

vec4 v = vec4(gl_Vertex);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
norm = vec4(norm,1) * gl_ModelViewMatrix;
vec3 tang = normalize(gl_NormalMatrix * Tangent);
tang = vec4(tang,1) * gl_ModelViewMatrix;
vec3 binorm = cross(norm,tang);

eyeDir = vec3(gl_ModelViewMatrix * v);

vec3 tmp;
tmp.x = dot(LightPos,tang);
tmp.y = dot(LightPos,binorm);
tmp.z = dot(LightPos,norm);
lightDir = normalize(tmp);

tmp.x = dot(eyeDir,tang);
tmp.y = dot(eyeDir,binorm);
tmp.z = dot(eyeDir,norm);
eyeDir = normalize(tmp);

gl_TexCoord[0] = gl_MultiTexCoord0;
}



Thanks for the help

Emiug

Share this post


Link to post
Share on other sites
Well, this code should be all right (but I'm not 100% sure).


varying vec3 lightDir;
varying vec3 eyeDir;

attribute vec3 Tangent;

uniform vec3 LightPos;

void main(void)
{
gl_Position = ftransform();

vec4 v = vec4(gl_Vertex * gl_ModelViewMatrix);
vec3 norm = normalize(gl_Normal);
vec3 tang = normalize(Tangent);
vec3 binorm = cross(norm,tang);
binorm = vec4(binorm,1) * gl_ModelViewMatrix;
norm = vec4(norm,1) * gl_ModelViewMatrix;
tang = vec4(tang,1) * gl_ModelViewMatrix;

// Well, i'm not sure, if this works, i'm sending camera position from
// application to shader as vec3, then take direction as (cameraPos - v)
// and normalize it, btw. direction needs to be normalized!
eyeDir = normalize(vec3(gl_ModelViewMatrix * v));

// Light direction is vector from position to vertices on screen, we have
// vertices in world space, so LightPos needs to be in world space too!
// and normalization is for direction needed too!
vec4 lightDirection = (vec4(LightPos, 1.0) * gl_ModelViewMatrix) - v;
lightDirection = normalize(lightDirection);
vec3 tmp;
tmp.x = dot(lightDirection.xyz,tang);
tmp.y = dot(lightDirection.xyz,binorm);
tmp.z = dot(lightDirection.xyz,norm);
lightDir = normalize(tmp);

tmp.x = dot(eyeDir,tang);
tmp.y = dot(eyeDir,binorm);
tmp.z = dot(eyeDir,norm);
eyeDir = normalize(tmp);

gl_TexCoord[0] = gl_MultiTexCoord0;
}


Anyway you'll calculate lighting in fragment shader like this:

varying vec3 lightDir;
varying vec3 eyeDir;

uniform sampler2D normalMap;

void main()
{
vec3 normalTex = texture2D(normalMap, gl_TexCoord[0].xy).xyz;
normalTex = normalTex * 2.0 - 1.0;

float DiffuseLight = max(dot(normalTex, lightDir), 0.0);
float SpecularLightBlinn = pow(max(dot(normalize(lightDir + eyeDir), normalTex), 0.0), 32.0);

gl_FragColor = vec4(DiffuseLight + SpecularLightBlinn, DiffuseLight + SpecularLightBlinn, DiffuseLight + SpecularLightBlinn, 1.0);
}


Well, good luck with your project and I hope this codes are all right, if not, let me know, i'll post some "better to understand".

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this