GLSL reusable/shared functions, shared constants (OpenGL ES 2.0)?

笑着哭i 提交于 2019-12-04 18:49:27

问题


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:

  1. in some shader (string) you define function (lets call it COMMON):

    float getCommonValue() { return 42; }
    
  2. 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); }
    
  3. when compiling shaders with glCompileShader you compile COMMON shader only once and store shader GLuint somewhere

  4. 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.

  5. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!