将更多着色器(源)加入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版本
答案 0 :(得分:2)
与添加代码中已有的着色器的方式完全相同。您可以创建更多着色器,为其调用glCompileShader()
和glAttachShader()
,然后调用glLinkProgram()
。
但是你需要知道这是做什么的。虽然向程序添加多个相同类型的着色器是完全合法的,但每种类型的着色器中只有一个可以具有main()
功能。
当一个相同类型的多个着色器附加到程序(这不是很常见)时,我看到的典型设置是某些着色器包含"实用程序"的集合。函数,然后是包含main()
函数的每种类型类型的一个着色器,并实现整个着色器逻辑。此设置对于复杂着色器非常有用,因为具有实用程序功能的着色器可以编译一次,然后连接到多个不同的程序,而无需每次都编译它们。
我不确定这是否是你所追求的。如果您真的只想使用不同的着色器集,那么更常见的设置是为每对顶点/片段着色器创建一个程序,然后在渲染期间通过使用程序调用{{1}}在它们之间切换你需要渲染的每个部分。