使用空着色器程序进行绘制是否有效?

Is it valid to draw with an empty shader program?

本文关键字:绘制 是否 有效 程序      更新时间:2023-10-16

在我的游戏中有一个处理着色器,帧缓冲和绘图的渲染模块。现在我想分别封装这三个任务的逻辑。我的想法是把渲染模块分成三个模块。我这样做是为了降低代码复杂性,并轻松实现实时着色器重载,但对我的问题并不重要。

绘图模块将使用glCreateProgram()创建空着色器对象,并将它们与源文件的路径一起全局存储。shader模块将检查它们,并通过加载源文件、编译和链接来创建实际的shader。

但是在这个概念中,可能会发生渲染模块已经想要绘制但着色器模块没有创建实际着色器的情况。所以我的问题是,它是有效的绘制与空着色程序?当这种情况发生时,我完全可以接受屏幕变黑。创建着色器应该很快准备好,所以延迟可能是不明显的。

使用空着色器程序进行绘制是否有效?我如何实现其他地方加载着色器的想法?

如何定义"valid"answers"empty"?

如果程序对象的最后一个链接不成功(或者如果它没有最后一个链接),那么调用glUseProgram是一个GL_INVALID_OPERATION错误。这也意味着glUseProgram将失败,因此当前程序不会改变。所以所有的glUniform调用将指向那个程序,而不是新的程序;如果该程序为零,则会得到更多的GL_INVALID_OPERATION错误。

如果没有当前程序(即程序为0),则尝试渲染将产生未定义的行为。

未定义的行为对你的需求是"有效的"吗?如果您不打算向用户显示该帧(通过不调用交换缓冲区),那么您呈现的内容将无关紧要。在OpenGL错误队列中拥有所有这些错误对你来说是"有效的"吗?

文档中相关的两行:

  • glAttachShader

无论着色器对象是否附加到程序对象上,可以在着色器对象上执行的所有操作都是有效的。在源代码被加载到shader对象或shader对象被编译之前,可以将shader对象附加到程序对象。

  • glUseProgram

如果program为零,则当前渲染状态指的是无效的程序对象,着色器执行的结果是未定义的。然而,这不是一个错误。如果程序不包含GL_FRAGMENT_SHADER类型的着色器对象,则将在顶点上安装可执行文件,也可能安装几何处理器,但片段着色器执行的结果将未定义。

因此,这样做似乎是可能的,但您可能不会在所有机器上得到相同的结果。