http://docs.gl/gl4/glCreateShaderProgram
伪代码:
const GLuint shader = glCreateShader(type);
if (shader) {
glShaderSource(shader, count, strings, NULL);
glCompileShader(shader);
const GLuint program = glCreateProgram();
if (program) {
GLint compiled = GL_FALSE;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
if (compiled) {
glAttachShader(program, shader);
glLinkProgram(program);
glDetachShader(program, shader);
}
/* append-shader-info-log-to-program-info-log */
}
glDeleteShader(shader);
return program;
}
else {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不知道可以一次编译多个着色器。我遇到的问题是文档没有告诉我如何调用它。
如果我想编译一个顶点 + 片段着色器,我应该指定什么类型?最初我尝试过,glCreateShader(GL_VERTEX_SHADER | GL_FRAGMENT_SHADER);但后来它抱怨了两个main功能。OpenGL 可能将两个着色器解释为一个着色器。
glCreateShaderProgram()只编译和链接单个着色器。最后一个参数是一个字符串数组,就像 的相应参数一样glShaderSource(),它也用于指定一个着色器的来源。能够传递多个字符串只是为了方便这两个调用。例如,如果您的着色器代码是一个字符串数组(比如每行一个),您可以直接将它们传入,而无需先连接它们。
glCreateShaderProgram()旨在与程序管道对象结合使用。这种机制允许您组合来自多个程序的着色器,而无需链接它们。典型的调用序列如下所示:
GLuint vertProgId = glCreateShaderProgram(GL_VERTEX_SHADER, 1, &vertSrc);
GLuint fragProgId = glCreateShaderProgram(GL_FRAGMENT_SHADER, 1, &fragSrc);
GLuint pipelineId = 0;
glGenProgramPipelines(1, &pipelineId);
glUseProgramStages(pipelineId, GL_VERTEX_SHADER_BIT, vertProgId);
glUseProgramStages(pipelineId, GL_FRAGMENT_SHADER_BIT, fragProgId);
glBindProgramPipeline(pipelineId);
Run Code Online (Sandbox Code Playgroud)