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

标签 c++ opengl glsl

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

我发现我必须使用 glUseProgram() 来在不同的着色器程序之间切换,但关于它的信息不多。

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

最佳答案

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

  • glUseProgram绑定(bind)程序,用glUniform4fvglUniformMatrix4fv等设置制服

  • glBindVertexArray绑定(bind)顶点数组。

  • 使用 glActiveTextureglBindTexture 绑定(bind)您需要的任何纹理。

  • 更改任何其他状态,例如,glEnableglDisableglBlendFunc

  • 使用 glDrawArraysglDrawElements 绘制。

  • 如果需要,可将状态重置为默认值。

这些都是您在原始 OpenGL 3 代码中倾向于做的所有事情。您应该已经让这部分工作了。

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

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

关于c++ - 在 OpenGL 中使用不同的着色器程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39923583/

相关文章:

c++ - 用 C 或 C++ 编写的博客软件

c++ - 通过 QProcess 执行 VBS 从不发出 readyStandardOutPut

c++ - 如何使用 openGL 获得真正平滑的移动物体

c++ - glGetTexImage 使用 FBO 返回 0

c++ - OpenGL Shader Program使用时导致屏幕变黑

c++ - 在 Qt 中的对象之间发送自定义事件而不关联它们

c++ - Linux 中的磁盘空间使用情况分析

opengl - 无法释放共享上下文创建的纹理

c++ - 来自逆 vp 矩阵和相机位置的光线方向不正确

c++ - GLSL Sphere - 射线相交几何解决方案