art-ganseforth

09-25-2016, 06:20 AM

Hi there!

I have just started to use GLSL and i currently have general problems in understanding matrix-operations. It's years ago, when i had to work with matrices. So i have a newbie question concerning gl_ModelViewProjectionMatrix.

Background:

My idea (or some kind of experiment) is, to use the vertex-shader as "object-generator" - which is more flexible than static C-code. A huge part already works fine.

In the C-part of my program, i just generate a flat rectangle with x and y between 0 and 1 (with variable resolution) and z=0. In the vertex-shader i use x and y as sources to generate objects like ie. simply a torus.

Also normal-vectors are already calculated correct by the shader.

My problem is the object-positioning. For C-generated objects, i used "gl_Position = ftransform()", which i cant use in this case.

Using gl_ModelViewProjectionMatrix i get correct rotations but - somehow - translations are lost. So my torus can be rotated by calling glRotatef() in the C-part of the program, but glTranslatef() doesn't have any effect.

Here is the relevant vertex-shader-code (some function are shortened):

varying vec4 Vertex;

varying vec3 Normal;

vec4 rotateX (vec3 v, float a) {...}

vec4 rotateY (vec3 v, float a) {...}

vec4 rotateZ (vec3 v, float a) {...}

vec3 NormalVec(vec4 p, vec4 vX, vec4 vY) {...}

vec4 Torus(vec2 pos) {

vec4 v = vec4 (0.0, 0.0, 0.1, 0.0);

v = rotateY (v, pos.y * 2.0) + vec3(0.0, 0.0, 0.25);

v = rotateX (v, pos.x * 2.0);

return v;

}

void main () {

vec4 t1 = Torus(vec2(gl_Vertex));

vec4 t2 = Torus(vec2(gl_Vertex) + vec2(0.0, 0.01));

vec4 t3 = Torus(vec2(gl_Vertex) + vec2(0.01, 0.0));

Normal = NormalVec(t1, t2, t3);

t1 = t1 * gl_ModelViewProjectionMatrix;

Vertex = vec4(t1.x, t1.y, t1.z, 1);

gl_Position = Vertex;

}

Anyone knows why tranlations are lost??

Regards,

Frank

I have just started to use GLSL and i currently have general problems in understanding matrix-operations. It's years ago, when i had to work with matrices. So i have a newbie question concerning gl_ModelViewProjectionMatrix.

Background:

My idea (or some kind of experiment) is, to use the vertex-shader as "object-generator" - which is more flexible than static C-code. A huge part already works fine.

In the C-part of my program, i just generate a flat rectangle with x and y between 0 and 1 (with variable resolution) and z=0. In the vertex-shader i use x and y as sources to generate objects like ie. simply a torus.

Also normal-vectors are already calculated correct by the shader.

My problem is the object-positioning. For C-generated objects, i used "gl_Position = ftransform()", which i cant use in this case.

Using gl_ModelViewProjectionMatrix i get correct rotations but - somehow - translations are lost. So my torus can be rotated by calling glRotatef() in the C-part of the program, but glTranslatef() doesn't have any effect.

Here is the relevant vertex-shader-code (some function are shortened):

varying vec4 Vertex;

varying vec3 Normal;

vec4 rotateX (vec3 v, float a) {...}

vec4 rotateY (vec3 v, float a) {...}

vec4 rotateZ (vec3 v, float a) {...}

vec3 NormalVec(vec4 p, vec4 vX, vec4 vY) {...}

vec4 Torus(vec2 pos) {

vec4 v = vec4 (0.0, 0.0, 0.1, 0.0);

v = rotateY (v, pos.y * 2.0) + vec3(0.0, 0.0, 0.25);

v = rotateX (v, pos.x * 2.0);

return v;

}

void main () {

vec4 t1 = Torus(vec2(gl_Vertex));

vec4 t2 = Torus(vec2(gl_Vertex) + vec2(0.0, 0.01));

vec4 t3 = Torus(vec2(gl_Vertex) + vec2(0.01, 0.0));

Normal = NormalVec(t1, t2, t3);

t1 = t1 * gl_ModelViewProjectionMatrix;

Vertex = vec4(t1.x, t1.y, t1.z, 1);

gl_Position = Vertex;

}

Anyone knows why tranlations are lost??

Regards,

Frank