在同一程序上使用多个顶点着色器

时间:2011-09-26 01:15:47

标签: opengl-es-2.0 vertex-shader

我正在尝试使用顶点着色器实现投影。

有没有办法让一个单独的顶点着色器来处理设置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 个答案:

答案 0 :(得分:2)

在OpenGL ES中,唯一的方法是连接着色器源,但在OpenGL中,有一些有趣的功能可以让你做你想做的事情:

GL_ARB_shader_subroutine(OpenGL 4.0核心的一部分)   - 这几乎与你想要的一样

GL_ARB_separate_shader_objects(OpenGL 4.1核心的一部分)   - 此扩展允许您在不同程序中使用(混合)顶点和片段着色器,因此如果您有一个顶点着色器和多个片段着色器(例如,用于不同的效果),则此扩展适合您。

我承认这有点偏离主题,但我认为知道这一点很好(也可能对某些人有用)。