我的第一个问题在这里。在我的程序中,深度测试可以在某些计算机上正常工作,但不能在其他计算机上工作,位于较远位置的对象会覆盖位于较近位置的对象。我打电话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上下文的创建取决于OS和窗口库(例如GLFW,SDL,SFML)。默认情况下是否创建深度缓冲区通常取决于系统。通常,窗口库提供了其他选项,用于在生成OpenGL窗口时显式指定深度缓冲区:
例如:
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, 600, bpp, flags);
sf::ContextSettings settings;
settings.depthBits = 24;
// [...]
sf::Window window(sf::VideoMode(800, 600), "OpenGL window", sf::Style::Default, settings);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
glutInitWindowSize(800, 600);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句