在OpenGL中使用不同的着色器程序?

nur*_*gan 4 c++ opengl glsl

我必须在OpenGL中为不同的对象使用两个不同的着色器程序.

我发现我必须glUseProgram()在不同的着色器程序之间切换,但没有太多信息.

如果我有两个不同的着色器程序用于不同的对象,那么生成和绑定VAO和VBO如何为每个着色器程序(如何以及何时)工作?

Die*_*Epp 7

在OpenGL中渲染对象时,代码将如下所示:

  • 绑定程序与glUseProgram,与定制服glUniform4fv,glUniformMatrix4fv等等.

  • 用顶点数组绑定顶点数组glBindVertexArray.

  • 使用glActiveTexture和绑定所需的任何纹理glBindTexture.

  • 更改任何其他国家,例如glEnable,glDisable,glBlendFunc.

  • glDrawArrays或绘制glDrawElements.

  • 如果需要,请将状态重置为默认值.

这些都是您在vanilla OpenGL 3代码中所做的所有事情.你应该已经有了这部分工作.

如果需要使用不同的着色器程序编写多个对象,则只需多次执行上述步骤即可.如果要对多个程序使用相同的状态(除了为每个程序单独保存的制服外),可以省略状态更改.例如,您可以使用相同的VAO,相同的纹理,相同的混合函数等等.

如果您正在寻找更详细的示例,有许多关于OpenGL 3绘图命令如何工作的教程.

  • 另外:如果要在不同的着色器中使用相同的 VAO,则必须确保输入变量在两个着色器中的位置相同 (2认同)