2012-05-05 3 views
5

Short:GLSL многоразовые/совместно используемые функции, общие константы (OpenGL ES 2.0)?

Могу ли я определить функцию, которую могут использовать каждый шейдер? Или я должен определить его за шейдер?


Вся история:

  • Я хочу, чтобы создать многочисленные шейдеры, предназначенные для раскрашивания ввода фрагментов с заданными градиентных пандусов (что-то вроде этого - http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png).

  • Я хочу, чтобы определить градиент рампу константы для каждого шейдера (массива vec4 образцов цвета, где значение альфа имеет место положения градиента, см Pos на рисунке выше)

  • И мне нужно функция, которая может возвращать образец цвета из заданной градиентной рампы для конкретной позиции координат текстуры.

Так пандусы должны быть определенный РАЗ за затенения, а функция должна быть определена сразу, что каждый шейдер может безопасно использовать.

У меня есть алгоритмы, вопрос заключается в обмене функциями и определении констант в GLSL.

Возможно ли это? Или мне нужно скопировать функцию в каждый шейдер? Есть ли какой-то прекомпиляционный вариант?

ответ

9

Вы можете сделать это так же, как в C - вы объявляете функции в заголовках и определяете их в общем файле C.

В GLSL вам нужно сделать следующее:

  1. в некоторых шейдера (строка) можно определить функцию (позволяет называть его COMMON):

    float getCommonValue() { return 42; } 
    
  2. во всех шейдеров, которые вы хотите для использования этой функции вы только объявляете ее и используете ее (позвоните по телефону SHADER1):

    float getCommonValue(); 
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); } 
    
  3. при компиляции шейдеров с glCompileShader компиляция ОБЩЕГО шейдера только один раз и хранить шейдер GLuint где

  4. при связывании программы с glLinkProgram для SHADER1 прикрепить к программе с glAttachShader как шейдерами - COMMON и SHADER1. Таким образом, вы сможете вызвать функцию getCommonValue из одного шейдера в другой.

  5. вы можете повторно использовать значение COMMON shader GLuint несколько раз для разных программ sahder (SHADER1, SHADER2, ...).

+0

Ого, звучит неплохо, я попробую. – Geri

Смежные вопросы