Search code examples
opengl-esglslshader

OpenGL ES 2.0 Shader best practices


I've been searching for examples of shaders in OpenGL and I've seen some varying styles. Some shaders specifically use the built in types (ie. gl_Vertex) to transfer data to and from the application code and the shader.

Some shaders use the varying types to transfer data from vertex to fragment shader instead of gl_Position and gl_FragColor.

Some shaders use the prefixes 'in' and 'out' to specify data transfer:

in vec3 vertex;

void main() {
    gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
}

... while others use attributes:

attribute vec4 vertex_attrib;
attribute vec4 tex_coord_attrib;
attribute vec4 color_attrib;
uniform mat4 mvp_matrix;
uniform mat4 texture_matrix;
varying vec4 frag_color;
varying vec2 tex_coord;

void main(void)
{
  gl_Position = mvp_matrix * vertex_attrib;
  vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib;
  tex_coord = transformed_tex_coord.st / transformed_tex_coord.q;
  frag_color = color_attrib;
}

My question is, what is the preferred way in GLES 2.0 to write shaders? Is there a best practices guide? Can someone provide an example of a vertex & fragment shader that is a shining example of 'what to do'??

Thanks.


Solution

    1. There is no gl_Vertex in "ES 2.0". All attributes provided by you are custom.
    2. gl_Position is not an option in ES 2 but a requirement. Learn about OpenGL pipeline to understand why. Hint: it could be optional only when rasterizer is disabled (Transform Feedback, for example) but this is not supported in ES.
    3. In ES 2.0 vertex attributes have to have 'attribute' value and varyings have to be declared as 'varying'. Using 'in' and 'out' instead is a habit developed under OpenGL 3+ and can not be applied to ES.

    Finally, the best option for you would be to read OpenGL ES 2.0 Specification as suggested by Nicol Bolas. Rules first, best practices - later. Good luck!