OpenGL 深度测试在某些计算机上不起作用



我的第一个问题。在我的程序中,深度测试在一些计算机上可以正常工作,但在其他计算机上不起作用,因为位置较远的对象覆盖了位置较近的对象。我调用了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);
    

相关内容

最新更新