4
votes

First - Does subroutines require GLSL 4.0+? So it unavailable in GLSL version of OpenGL ES 2.0?

I quite understand what multi-pass shaders are.
Well what is my picture:

  1. Draw group of something (e.g. sprites) to FBO using some shader.
  2. Think of FBO as big texture for big screen sized quad and use another shader, which, for example, turn texture colors to grayscale.
  3. Draw FBO textured quad to screen with grayscaled colors.

Or is this called else?

So multi-pass = use another shader output to another shader input? So we render one object twice or more? How shader output get to another shader input?

For example

glUseProgram(shader_prog_1);//Just plain sprite draw
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, /*some texture_id*/);
 //Setting input for shader_prog_1
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
//Disabling arrays, buffers
glUseProgram(shader_prog_1);//Uses same vertex, but different fragment shader program
//Setting input for shader_prog_2
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Can anyone provide simple example of this in basic way?

1
As as side note, the (more-or-less) common term for what you are doing is rather "postprocessing" than "multipass rendering", which rather means drawing the same scene repeatedly accumulating the results to compose the final rendering.Christian Rau

1 Answers

10
votes

In general, the term "multi-pass rendering" refers to rendering the same object multiple times with different shaders, and accumulating the results in the framebuffer. The accumulation is generally done via blending, not with shaders. That is, the second shader doesn't take the output of the first. They each perform part of the computation, and the blend stage combines them into the final value.

Nowadays, this is primarily done for lighting in forward-rendering scenarios. You render each object once for each light, passing different lighting parameters and possibly using different shaders each time you render a light. The blend mode used to accumulate the results is additive, since light reflectance is an additive property.

Does subroutines require GLSL 4.0+? So it unavailable in GLSL version of OpenGL ES 2.0?

This is a completely different question from the entire rest of your post, but the answer is yes and no.

No, in the sense that ARB_shader_subroutine is an OpenGL extension, and it therefore could be implemented by any OpenGL implementation. Yes, in the practical sense that any hardware that actually could implement shader_subroutine could also implement the rest of GL 4.x and therefore would already be advertising 4.x functionality.

In practice, you won't find shader_subroutine supported by non-4.x OpenGL implementations.

It is unavailable in GLSL ES 2.0 because it's GLSL ES. Do not confuse desktop OpenGL with OpenGL ES. They are two different things, with different GLSL versions and different featuresets. They don't even share extensions (except for a very few recent ones).