将更多着色器(源)加入程序

时间:2014-06-29 03:24:16

标签: opengl glsl

将更多着色器(源)加入glsl程序的最简单方法是什么?通常,当顶点着色器和片段着色器附加到程序时,会执行以下操作:

  vertex   = glCreateShader(GL_VERTEX_SHADER);
  fragment = glCreateShader(GL_FRAGMENT_SHADER);
  programa = glCreateProgram();

  char *vsFuente = LEE_SHADER(rutaVert);
  char *fsFuente = LEE_SHADER(rutaFrag);

  if(vsFuente == NULL)return GL_FALSE;
  if(fsFuente == NULL)return GL_FALSE;

  const char *vs = vsFuente;
  const char *fs = fsFuente;

  glShaderSource(vertex  ,1,&vs,NULL);
  glShaderSource(fragment,1,&fs,NULL);

  delete [] vsFuente;
  delete [] fsFuente;

  glCompileShader(vertex);
  glCompileShader(fragment);

  glAttachShader(programa,vertex);
  glAttachShader(programa,fragment);

  glLinkProgram(programa);

好吧,如果我想将另一对着色器(顶点和片段)连接到同一个程序,我该怎么做?我使用的是OpenGL 2.0版本

1 个答案:

答案 0 :(得分:2)

与添加代码中已有的着色器的方式完全相同。您可以创建更多着色器,为其调用glCompileShader()glAttachShader(),然后调用glLinkProgram()

但是你需要知道这是做什么的。虽然向程序添加多个相同类型的着色器是完全合法的,但每种类型的着色器中只有一个可以具有main()功能。

当一个相同类型的多个着色器附加到程序(这不是很常见)时,我看到的典型设置是某些着色器包含"实用程序"的集合。函数,然后是包含main()函数的每种类型类型的一个着色器,并实现整个着色器逻辑。此设置对于复杂着色器非常有用,因为具有实用程序功能的着色器可以编译一次,然后连接到多个不同的程序,而无需每次都编译它们。

我不确定这是否是你所追求的。如果您真的只想使用不同的着色器集,那么更常见的设置是为每对顶点/片段着色器创建一个程序,然后在渲染期间通过使用程序调用{​​{1}}在它们之间切换你需要渲染的每个部分。

相关问题