Short:
Can I define a function that every shader can use? Or I have to define it per shader?
The whole story:
I want to create numerous shaders intended to colorize the input fragments with predefined gradient ramps (something like this - http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png).
I want to define a gradient ramp constant for each shader (an array of vec4 color samples, where the alpha value holds the gradient position, see Pos in the picture above)
And I need a function that can return a color sample from the given gradient ramp for a particular texture coordinate position.
So the ramps need to be defined ONCE per shader, and the function should be defined all at once that every shader can use safely.
I have the algorithms, the question is for sharing functions, and define constants in GLSL.
Is this possible? Or I have to copy the function into every shader? Is there some precompile option at least?
You can do that similarly as in C - you declare functions in headers and define it in common C file.
In GLSL you'll need to do following:
in some shader (string) you define function (lets call it COMMON):
float getCommonValue() { return 42; }
in all shaders you want to use this function you only declare it and use it (lets call it SHADER1):
float getCommonValue();
void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); }
when compiling shaders with glCompileShader
you compile COMMON shader only once and store shader GLuint somewhere
when you link program with glLinkProgram
for SHADER1 you attach to program with glAttachShader
both shaders - COMMON and SHADER1. Thus you'll be able to call getCommonValue
function from one shader to other.
you can reuse COMMON shader GLuint value multiple times for different sahder programs (SHADER1, SHADER2, ...).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With