我正在尝试使用顶点着色器实现投影。
有没有办法让一个单独的顶点着色器来处理设置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
答案 0 :(得分:2)
在OpenGL ES中,唯一的方法是连接着色器源,但在OpenGL中,有一些有趣的功能可以让你做你想做的事情:
GL_ARB_shader_subroutine(OpenGL 4.0核心的一部分) - 这几乎与你想要的一样
GL_ARB_separate_shader_objects(OpenGL 4.1核心的一部分) - 此扩展允许您在不同程序中使用(混合)顶点和片段着色器,因此如果您有一个顶点着色器和多个片段着色器(例如,用于不同的效果),则此扩展适合您。
我承认这有点偏离主题,但我认为知道这一点很好(也可能对某些人有用)。