问题描述
我的第一个问题在这里。在我的程序中,深度测试可以在某些计算机上正常运行,但不能在其他计算机上运行,位于较远位置的对象会覆盖位于较近位置的对象。我打电话给glEnable(GL_DEPTH_TEST);
并尝试打电话给glDepthFunc(GL_LESS);
,正如我所说,在某些计算机上一切正常,但是在其他计算机上同一个程序却无法正常工作。怎么解决?
编辑:问题已解决。在调用之前添加了这些行
al_create_display();
,一切正常
al_set_new_display_option( ALLEGRO_COLOR_SIZE,32,ALLEGRO_REQUIRE);
al_set_new_display_option( ALLEGRO_DEPTH_SIZE,24,ALLEGRO_REQUIRE);
al_set_new_display_option( ALLEGRO_STENCIL_SIZE,8,ALLEGRO_REQUIRE);
al_set_new_display_option( ALLEGRO_AUX_BUFFERS,ALLEGRO_REQUIRE);
al_set_new_display_option( ALLEGRO_SAMPLES,4,ALLEGRO_SUGGEST);
解决方法
除了激活Depth Test(glEnable(GL_DEPTH_TEST)
)之外,重要的是当前的framebuffer具有depth buffer。
default framebuffer是在构造OpenGL Context时创建的。 OpenGL上下文的创建取决于操作系统和窗口库(例如GLFW,SDL,SFML)。默认情况下是否创建深度缓冲区通常取决于系统。通常,窗口库提供了其他选项,用于在生成OpenGL窗口时显式指定深度缓冲区:
例如:
-
GLFW - Framebuffer related hints
glfwWindowHint(GLFW_DEPTH_BITS,24); // [...] GLFWwindow *wnd = glfwCreateWindow(800,600,"OpenGL window",nullptr,nullptr);
-
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24); // [...] SDL_SetVideoMode(800,bpp,flags);
-
SFML - Using OpenGL in a SFML window
sf::ContextSettings settings; settings.depthBits = 24; // [...] sf::Window window(sf::VideoMode(800,600),sf::Style::Default,settings);
-
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); glutInitWindowSize(800,600);