Search Unity

A vertex position is a float4. What does the 4th component represent?

Discussion in 'Shaders' started by lifeformed, Sep 28, 2012.

  1. lifeformed


    Aug 1, 2012
    In the vertex input data structure to vertex shaders, you specify a position as float4:

    Code (csharp):
    1.          struct vertexInput {
    2.             float4 vertex : POSITION;
    3.          };
    I understand x, y, and z correspond to the vertex's xyz coordinates. What about w?
  2. Martin-Kraus


    Feb 18, 2011
    Here is an explanation why the fourth coordinate should always be 1:

    (For pedantic geeks: If you know about the homogeneous division you might think that you can use any other nonzero value if you scale the other coordinates with it. This is only true if you do it with all(!) vertices of your mesh, otherwise the perspective interpolation is messed up because the specification of perspective interpolation in OpenGL assumes that all fourth coordinates of the vertices are the same.)

    EDIT: Oops, I forgot: yes, the fourth component should be 1 only for points and it needs to be 0 for directions as mentioned by Farfarer.
    Last edited: Sep 28, 2012
  3. Farfarer


    Aug 17, 2010
    If I'm right, matrix transforming a 4 component value with the fourth component being 0, it'll rotate but not move the value. If it's filled with 1, it'll rotate and move the value.

    So the first one would be for vectors (only rotation is needed) the second would be for positions (where you need both rotation and translation).

    Which is why the vector transforms appear as mul((float3x3)matrix, float3) as there's no need to calculate then ignore the fourth component.