问题
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?
回答1:
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
glCompileShaderyou compile COMMON shader only once and store shader GLuint somewherewhen you link program with
glLinkProgramfor SHADER1 you attach to program withglAttachShaderboth shaders - COMMON and SHADER1. Thus you'll be able to callgetCommonValuefunction from one shader to other.you can reuse COMMON shader GLuint value multiple times for different sahder programs (SHADER1, SHADER2, ...).
来源:https://stackoverflow.com/questions/10464022/glsl-reusable-shared-functions-shared-constants-opengl-es-2-0