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

问题描述:

我想使用顶点着色器实现投影。在同一个程序中使用多个顶点着色器

有没有办法让单独的顶点着色器来处理设置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; 
} 

然后用它作为这样:在OpenGL ES

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

我可以考虑根据上下文使用不同着色器的唯一方法是切换频繁使用的着色器程序(通过['glUseProgram'](http://www.opengl.org/sdk/docs/man3/) XHTML/glUseProgram.xml))。 – darvids0n

+2

您不需要手动连接着色器,'glShaderSource'为您完成,您只需要将'count'参数,字符串数组('char **')作为'string'参数传递给2,并且array长度('int *')作为'length'参数。 – Triang3l

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

GL_ARB_shader_subroutine(OpenGL的4.0内核的一部分) - 这确实非常想要的东西

GL_ARB_separate_shader_objects(OpenGL的4.1内核的一部分) - 此扩展,可以使用不同的(混合)的顶点和片段着色器程序,所以如果你有一个顶点着色器和几个片段着色器(例如对于不同的效果),那么这个扩展是给你的。我承认这有点偏离主题,但我认为很好知道(也可能对某人有用)。

+0

谢谢,我会检查出来。 – sharvey