OpenGL 程序/着色器未初始化

标签 opengl

执行此操作的正确方法是什么?

我正在执行以下步骤:

  1. 创建着色器
  2. 编译着色器
  3. 创建程序
  4. 将着色器附加到程序
  5. 链接程序
  6. 删除着色器

http://www.opengl.org/wiki/GLSL_Object它说:即使在链接程序之后,您也不必显式分离着色器对象。但是,最好在链接完成后执行此操作,否则当您尝试删除附加的着色器对象时,程序对象将使其保持事件状态。

也来自Proper way to delete GLSL shader?说如果我不删除着色器,它会增加内存。

所以检查http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xml ,它表示如果着色器已通过调用 glDeleteShader 被标记为删除,并且它未附加到任何其他程序对象,则在分离后它将被删除。

所以我的 #6 是没有用的,除非我在正确之后将其分离?

我应该在程序正确编译后分离并删除(以节省内存)还是应该仅在我的应用程序关闭时分离/删除?

最佳答案

So my #6 is useless unless I detach it after right?

是的。 GL 所做的基本上就是引用计数。只要其他对象引用该着色器对象,它就会保持事件状态。如果删除该对象,实际删除将推迟到最后一个引用被删除为止。

Should I detach and delete after the Program has been compiled correctly (to save the memory) or should I detach/delete only when my application is closing down?

这取决于你。一旦您不再需要它,可以将其删除。如果您不打算重新链接该着色器,则可以在初始链接操作后立即销毁所有附加的着色器对象。然而,着色器对象毕竟不会消耗太多内存(并且不会进入 GPU 内存,只有最终的程序才会),如果您稍后删除它们,或者甚至不删除它们,通常也没什么大不了的。 all,因为当GL上下文被销毁时(包括应用程序退出的情况),所有的GL资源都会被销毁。当然,如果您在运行时动态创建着色器,您还应该动态删除旧的和未使用的对象,以避免积累大量未使用的对象并有效泄漏内存/对象名称等。

关于OpenGL 程序/着色器未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18516798/

相关文章:

c# - 为什么我的 PNG 纹理不透明?

opengl - 如何在 3d 中挤出路径?

opengl - 不了解 gluOrtho2D 函数

winapi - 从 GDI+ 迁移到 OpenGL 有什么缺点吗?

c++ - OpenGL 变换反馈不返回任何东西

r - 深色背景的 rgl 输出中的文本显示不佳

c++ - 从 4 个点计算旋转矩阵

opengl - 在 autoconf 脚本中处理非标准库位置的正常方法是什么?

opengl - 平面阻塞多分辨率体绘制

winforms - 您可以同时创建多少个 OpenGL 渲染上下文是否有限制?