34

I am new to OpenGL ES 2.0, and cannot understand the following simplest shader:

attribute vec4 vPosition;
void main()
{
   gl_Position = vPosition;
}

My question is, since a position would be a vector of (x, y, z), why is gl_Position a vec4 instead of vec3?

peter
  • 1,034
  • 1
  • 9
  • 23
  • 1
    Some good explanations in this thread: http://www.gamedev.net/topic/506162-3d-math-4-component-vectors/ – Tim Mar 30 '12 at 16:38

2 Answers2

29

The w in vec4(x, y, z, w) is used for clipping, and plays its part while linear algebra transformations are applied to the position.

By default, this should be set to 1.0.

See here for some more info: http://web.archive.org/web/20160408103910/http://iphonedevelopment.blogspot.com/2010/11/opengl-es-20-for-iOS-chapter-4.html

Peter O.
  • 32,158
  • 14
  • 82
  • 96
Matisse VerDuyn
  • 1,148
  • 15
  • 40
5

If you provide your vertices to the shader directly in clip space, you could just pass x,y,z and add 1 as the w component in that shader.

attribute vec3 vPosition; // vec3 instead of vec4
void main()
{
   gl_Position = vec4 (vPosition, 1.0);
}
Drout
  • 327
  • 4
  • 7