我的第一个问题。在我的程序中,深度测试在一些计算机上可以正常工作,但在其他计算机上不起作用,因为位置较远的对象覆盖了位置较近的对象。我调用了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, 0, ALLEGRO_REQUIRE);
al_set_new_display_option( ALLEGRO_SAMPLES, 4, ALLEGRO_SUGGEST);
除了激活深度测试(glEnable(GL_DEPTH_TEST)
(外,当前帧缓冲区还必须具有深度缓冲区
默认帧缓冲区是在构造OpenGL上下文时创建的。OpenGL上下文的创建取决于操作系统和窗口库(例如GLFW、SDL、SFML(。是否默认创建深度缓冲区通常取决于系统。通常,在生成OpenGL窗口时,窗口库提供了用于显式指定深度缓冲区的附加选项:
例如:
-
GLFW-帧缓冲区相关提示
glfwWindowHint(GLFW_DEPTH_BITS, 24); // [...] GLFWwindow *wnd = glfwCreateWindow(800, 600, "OpenGL window", nullptr, nullptr);
-
SDL-使用OpenGL和SDL
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); // [...] SDL_SetVideoMode(800, 600, bpp, flags);
-
SFML-在SFML窗口中使用OpenGL
sf::ContextSettings settings; settings.depthBits = 24; // [...] sf::Window window(sf::VideoMode(800, 600), "OpenGL window", sf::Style::Default, settings);
-
供过于求-
glutInitDisplayMode
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); glutInitWindowSize(800, 600);