初识OpenGL (4)链接着色器

1. 着色器程序

着色器程序对象(Shader Program Object)是多个着色器合并之后并最终链接完成的版本。如果要使用刚才编译的着色器我们必须把它们链接(Link)为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。

当链接着色器至一个程序的时候,它会把每个着色器的输出链接到下个着色器的输入。当输出和输入不匹配的时候,你会得到一个连接错误。

step1. 创建着色器程序对象

glCreateProgram函数创建一个程序,并返回新创建程序对象的ID引用。

unsigned int shaderProgram;
shaderProgram = glCreateProgram();

step2. 把之前编译的着色器附加到程序对象上,然后用glLinkProgram链接它们

glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);

step3. 检测链接着色器程序是否失败,并获取相应的日志。

与之前不同,我们不会调用glGetShaderiv和glGetShaderInfoLog

glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success) {
    
    
    glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
    ...
}

step4. 激活这个程序对象

调用glUseProgram函数,用刚创建的程序对象作为它的参数。

glUseProgram(shaderProgram);

在glUseProgram函数调用之后,每个着色器调用和渲染调用都会使用这个程序对象(也就是之前写的着色器)了。

step5. 删除着色器对象

glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);

现在,我们已经把输入顶点数据发送给了GPU,并指示了GPU如何在顶点和片段着色器中处理它。就快要完成了,但还没结束,OpenGL还不知道它该如何解释内存中的顶点数据,以及它该如何将顶点数据链接到顶点着色器的属性上。下一步需要告诉OpenGL怎么做。

猜你喜欢

转载自blog.csdn.net/thefist11cc/article/details/125904446