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

时间:2013-03-17 14:30:17

标签: c++ opengl rendering glsl shader

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

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

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

使用空着色器程序绘制是否有效?我怎么能实现其他地方加载的着色器的想法呢?

2 个答案:

答案 0 :(得分:1)

文档中的两个相关行:

  

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

  

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

所以似乎可以这样做,但你可能无法在所有机器上得到相同的结果。

答案 1 :(得分:1)

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

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

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

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