# gl_vertex.w

what does the .w component of gl_Vertex stands for ?

its value are :
1 if you don’t change it
0 if you want to throw the vertex to infinity

are there any other specific values that could be usefull ?

wizzo

.w is homogenius coordinate. Simple… if .w is 1.0 and vertex is transformed by 4x4 matrix it will be affected by translation part of matrix. If .w is 0.0 it will not be affected by translation part.

You can use it for some kind of geometry blending… imagine sphere with vertices that have .w in 0 to 1 (different values) and two matrices 4x4. In vertex shader do something like this:

``````vec4 v1 = matrix1 * gl_Vertex;
vec4 v2 = matrix2 * vec4(gl_Vertex.xyz, 1.0 - gl_Vertex.w);
vec4 finalvert = v1 + v2;
``````

And finalvertex will have “blended” position.

yooyo

Uhm, no, I wouldn’t do this.
The gl_Vertex.w and its result after the transformation is important for clipping space calculations (check OpenGL spec chapter 2.11 Coordinate Transformations) and you can’t just put a weight into the w and expect things to work like this.

Originally posted by Relic:
Uhm, no, I wouldn’t do this.

It doesn’t work if you do blending like that.

Blending is done by transforming a vertex by 2 matrices (or more)

result1 = matrix1 * vertex;
result2 = matrix2 * vertex;

//and use some blend factor
blendvertex = mix(result1, result2, blend_factor);

the value of w in vertex doesn’t matter. The blending will always work.

its value are :
1 if you don’t change it
0 if you want to throw the vertex to infinity

It can have any value.

Well, I know it is not correct and I put blended in quotes. Correct solution might be:

``````vec4 v = vec4(gl_Vertex.xyz, 1.0);
vec4 v1 = matrix1 * v;
vec4 v2 = matrix2 * v;
vec4 finalvert = mix(v1, v2. gl_Vertex.w);
``````

yooyo

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