0

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

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

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

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

4

2 回答 2

1

文档中的两个相关行:

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

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

所以似乎可以做到这一点,但你可能不会在所有机器上得到相同的结果。

于 2013-03-17T14:35:47.743 回答
1

你如何定义“有效”和“空”?

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

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

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

于 2013-03-17T14:41:01.280 回答