【问题标题】:Using multiple vertex shaders on the same program在同一个程序上使用多个顶点着色器
【发布时间】:2011-09-26 01:15:47
【问题描述】:

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

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

【问题讨论】:

  • 我认为根据上下文使用不同着色器的唯一方法是切换您经常使用的着色器程序(通过glUseProgram)。
  • 您不需要手动连接着色器,glShaderSource 为您完成,您只需将 2 作为 count 参数传递,字符串数组 (char **) 作为 @987654329 @ 参数,长度数组 (int *) 作为 length 参数。
  • 您可以自己跳过合并字符串,只需将多个字符串提供给 [glShaderSource](http://docs.gl/es2/glShaderSource)。

标签: opengl-es-2.0 vertex-shader


【解决方案1】:

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

GL_ARB_shader_subroutine(OpenGL 4.0 核心的一部分) - 这几乎可以满足您的需求

GL_ARB_separate_shader_objects(OpenGL 4.1 核心的一部分) - 这个扩展允许你在不同的程序中使用(混合)顶点和片段着色器,所以如果你有一个顶点着色器和几个片段着色器(例如用于不同的效果),那么这个扩展是给你的。

我承认这有点离题,但我认为很高兴知道(也可能对某人有用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    相关资源
    最近更新 更多