使用空着色器程序进行绘制是否有效?
Is it valid to draw with an empty shader program?
在我的游戏中有一个处理着色器,帧缓冲和绘图的渲染模块。现在我想分别封装这三个任务的逻辑。我的想法是把渲染模块分成三个模块。我这样做是为了降低代码复杂性,并轻松实现实时着色器重载,但对我的问题并不重要。
绘图模块将使用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类型的着色器对象,则将在顶点上安装可执行文件,也可能安装几何处理器,但片段着色器执行的结果将未定义。
因此,这样做似乎是可能的,但您可能不会在所有机器上得到相同的结果。
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?
- 如何检查在 Adafruit TFT 屏幕上绘制的两个圆圈是否相互接触
- 如何确定我跟踪的对象球是否越过我绘制的线
- SetWindowPos是否立即绘制
- 使用OpenCV教程中的任何一个进行人脸检测是否有任何函数可以计算绘制在人脸上的矩形的大小
- 是否可以使用 SFML 绘制曲线
- 是否可以在仅用于循环的形状中绘制形状?如果是,请给我指一个正确的方向
- 是否可以在Visual C++2010学习版中绘制图形
- 绘制或渲染QGraphicsView或QWidget时是否存在信号或事件
- 是否可以使用G_TRIANGLE_FAN或GL_TRIANGLE_STRIP绘制两个单独的四边形
- 是否可以在directx dc/buffer上使用opengl进行绘制?
- 是否有一种方法可以在Qt中重新绘制区域
- 是否有可能保存当前的视口,然后在OpenGL和c++中在下一个绘制周期中重新绘制保存的视口?
- 是否有C或c++的高级图形绘制API ?
- 使用GL_TRIANGLE_STRIP或索引gl_三角形来绘制动态数量的四边形是否更有效?
- 在窗口中绘制之前是否有必要使更新区域无效?
- 使用空着色器程序进行绘制是否有效?
- 是否可以将Windows位图绘制到cairo表面
- 是否可以在另一个窗口中绘制(使用 Opencv/ffmpeg