GL_DEPTH_TEST在程序

时间:2016-05-18 00:17:41

标签: opengl

正在关注learnopengl.com上的一些教程,移动相机并突然GL_DEPTH_TEST失败。

GL_DEPTH_TEST WORKS AT FIRST, THEN FAILS

程序看起来像这样

int main(){
    glEnable(GL_DEPTH_TEST);
    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glDrawArrays(GL_TRIANGLES, 0, 36); //some draw function
    }
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
    handler();
}

它实际上也失败了一些其他程序(意味着我正在构建的其他教程)。如果我将glEnable(GL_DEPTH_TEST)放在循环中,那么它不会失败,所以我怀疑GL_DEPTH_TEST在运行时已经以某种方式被禁用/失败。

  • 有没有理由发生这种情况?
  • 怎么预防呢?
  • glEnable(GL_DEPTH_TEST)置于循环中正确的解决方案?
  • 与硬件有关吗?我正在使用Phenom X6 AMD CPU和一些Radeon 6850卡 我的Windows PC。

编辑:

我认为我的窗口实际上是非常标准的东西

#include <GLFW/glfw3.h>
int main(){
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    glewInit();
    while(!glfwWindowShouldClose(window)){}
}

编辑:

我使用函数glIsEnabled()来检查,确实GL_DEPTH_TEST在某段时间后被禁用。这发生在2个构建的程序中,一个只是通过key_press进行平移(更改摄像机位置),另一个通过glfwGetTime()旋转。第if(!glIsEnabled(GL_DEPTH_TEST)) std::cout << "time: " << glfwGetTime() << " no depth!!" << std::endl;行给出了输出。

谷歌地图WebGL在后台是否与此有关?

我想我将不得不求助于将GL_DEPTH_TEST置于循环中。

2 个答案:

答案 0 :(得分:1)

  
      
  • 是否有理由这样做?
  •   

通常不会。 OpenGL状态不应该突然改变。但是,您安装了其他软件,这些软件会为您的OpenGL上下文注入DLL并执行操作。 FRAPS(屏幕截图软件),Stereoscopic / Virtual-Reality包装器,调试覆盖等程序

  
      
  • 如何预防?
  •   

编写正确的代码;) - 我的意思是完整的堆栈:您的程序,某人编写的操作系统,其他人编写的GPU驱动程序。错误发生。

  
      
  • 将glEnable(GL_DEPTH_TEST)放在循环中正确的解决方案吗?
  •   

是。实际上,您应该始终在每次绘制迭代时重新设置所有绘图相关状态。不仅是出于正确的原因,而且因为使用更高级的渲染技术,最终你还是必须这样做。例如,如果您要渲染阴影贴图,则必须使用FBO,这需要在渲染帧期间多次设置glViewport。或者说你要绘制小地图和/或HUD,然后你必须在两者之间禁用深度测试。

如果您的程序从一开始就是这样构建的,那么事情就变得容易了。

  
      
  • 与硬件有关吗?
  •   

没有。 OpenGL是一个软件级规范,符合规范的实现必须遵循规范所述,无论底层硬件如何。

答案 1 :(得分:0)

这可能是你的窗口声明。你能为windows和opengl进行初始化吗?

修改

我可以看到你宣布OpenGL 3.3,你必须把

glewExperimental = GL_TRUE;

在glewInit之前使其正常工作。 尝试将其置于并控制glewInit返回的最终错误:

GLuint err = glewInit();
  

谷歌地图WebGL在后台是否与此有关?

不,不应该这样,因为OpenGL不会在进程之间共享数据。