在我的游戏中,有一个渲染模块可以处理着色器,帧缓冲区和绘图。现在,我想分别封装这三个任务的逻辑。我的想法是将渲染模块分为三个模块。我这样做是为了降低代码复杂性并轻松实现实时着色器重新加载,但这对我的问题并不重要。
绘图模块将使用glCreateProgram()
创建空的着色器对象,并将其与源文件的路径一起全局存储。着色器模块将检查它们并通过加载源文件,编译和链接来创建实际的着色器。
但是在这种情况下,可能会出现以下情况:渲染模块已经要绘制,但着色器模块尚未创建实际的着色器。所以我的问题是,使用空的着色器程序绘制是否有效?发生这种情况时,屏幕为黑色是完全可以接受的。创建着色器应该很快就准备就绪,因此延迟可能不会引起注意。
使用空的着色器程序绘制是否有效?我如何才能实现其他地方加载的着色器的想法?
最佳答案
您如何定义“有效”和“空”?
如果程序对象的最后一个链接不成功(或者没有最后一个链接),则在其上调用glUseProgram
是一个GL_INVALID_OPERATION
错误。这也意味着glUseProgram
将失败,因此当前程序将不会更改。因此,所有glUniform
calls都将引用该程序,而不是新程序。如果该程序为零,则会收到更多的GL_INVALID_OPERATION
错误。
如果没有当前程序(即程序为0),则尝试渲染将产生未定义的行为。
未定义的行为是否对您的需求“有效”?如果不打算通过不调用交换缓冲区向用户显示该帧,则渲染的内容将无关紧要。 OpenGL错误队列中的所有这些错误对您来说是否“有效”?
关于c++ - 使用空的着色器程序绘制是否有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15461877/