如何使用 glCreateShaderProgram?

Mai*_*ein 3 c++ opengl

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 可能将两个着色器解释为一个着色器。

Ret*_*adi 6

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)