正在关注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)
置于循环中正确的解决方案?编辑:
我认为我的窗口实际上是非常标准的东西
#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置于循环中。
答案 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();
不,不应该这样,因为OpenGL不会在进程之间共享数据。谷歌地图WebGL在后台是否与此有关?