【问题标题】:OpenGL3 two sets of shaders, texture showing blackOpenGL3 两组着色器,纹理显示为黑色
【发布时间】:2012-08-25 23:36:02
【问题描述】:

我最近成功地制作了一个带有 GL_TEXTURE_RECTANGLE 的小型测试应用。现在我正在尝试将它集成到我更大的项目中,但是当我在渲染函数中调用 glBindTexture(GL_TEXTURE_RECTANGLE, _tex_id[0]) 时,它会导致 GL_INVALID_OPERATION 错误。纹理图像有时会显示几分之一秒,然后变黑并保持黑色。

我试图通过使用两组顶点和片段着色器来做到这一点,一组用于 3D 场景,一组用于 2D 叠加,但我以前从未尝试过,所以我不知道那是不是是什么导致了错误,或者我是否应该以不同的方式解决这个问题。着色器都可以正常编译和链接。

任何见解都将不胜感激,如果对查看一些代码有帮助,请告诉我,我会发布其中的一些(尽管我认为任何人都无法合理地浏览它)。

编辑: gDEBugger 在调用 glBindTexture() 时中断,单击断点时,属性窗口会显示我的其他纹理之一的图片(由 3D 场景的着色器),它表明它正在尝试加载纹理编号 1,但我知道这个数字已经被用于绘制属性窗口中显示的相同 3D 场景的纹理......为什么 glGenTextures() 会给我重叠的纹理 ID 编号?这是正常现象还是部分问题?

【问题讨论】:

    标签: c++ opengl opengl-3


    【解决方案1】:

    黑色纹理是由于我没有将一些顶点着色器输入(法线)转发到片段着色器,即使我没有对 2D 叠加着色器中的任何内容使用法线。当我为所有输入添加输出并将它们转发到片段着色器时,纹理不再是黑色的,但它仍然在几分之一秒后消失。这是因为我在渲染函数的末尾调用 glBindTexture(GL_TEXTURE_RECTANGLE, 0) 并希望它会清理某些状态......这显然是错误的做法,因为删除该调用会导致 2D 纹理留在屏幕上。此外,使用 GL_TEXTURE_RECTANGLE 目标调用 glBindTexture() 似乎在纹理设置阶段有效,但在渲染 GL_TEXTURE_RECTANGLE 目标期间会导致 GL_INVALID_OPERATION 错误。仅在渲染函数中将目标更改为 GL_TEXTURE_2D 会使错误消失,现在一切似乎都运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 2021-07-17
      • 1970-01-01
      • 2012-07-14
      • 2020-04-17
      • 1970-01-01
      • 2023-02-03
      相关资源
      最近更新 更多