Использование нескольких вершинных шейдеров в одной программе - PullRequest
0 голосов
/ 26 сентября 2011

Я пытаюсь реализовать проекцию, используя вершинный шейдер.

Есть ли способ иметь отдельный вершинный шейдер для обработки набора gl_Position и иметь другой вершинный шейдер для установки значений, необходимых дляфрагментный шейдер?

У меня проблема в том, что вызывается только функция main () первого вершинного шейдера.

Редактировать: я нашел способ заставить его работать, комбинируя шейдерисходники вместо использования нескольких независимых шейдеров.Я не уверен, что это лучший способ сделать это, но, похоже, он хорошо работает.

main_shader.vsh

attribute vec4 src_color;

varying vec4 dst_color; // forward declaration

void transform(void);

void main(void)
{
    dst_color = src_color;
    transform();
}

transform_2d.vsh

attribute vec4 position;

void transform(void)
{
    gl_Position = position;
}

Тогда используйте это так:

char merged[2048];
strcat(merged, main_shader_src);
strcat(merged, transform_shader_src);
// create and compile shader with merged as source

1 Ответ

2 голосов
/ 20 января 2012

в OpenGL ES единственный способ состоит в объединении источников шейдеров, но в OpenGL есть несколько интересных функций, которые позволяют вам делать то, что вы хотите:

GL_ARB_shader_subroutine (часть ядра OpenGL 4.0) - этоделает в значительной степени то, что вы хотели

GL_ARB_separate_shader_objects (часть ядра OpenGL 4.1) - Это расширение позволяет вам использовать (смешивать) вершинные и фрагментные шейдеры в разных программах, поэтому, если у вас есть один вершинный шейдер и несколько фрагментных шейдеров (например, для различных эффектов), тогда это расширение для вас.

Я признаю, что это немного оффтоп, но я думаю, что это полезно знать (также, может быть полезно для кого-то).

...