【问题标题】:OpenGL: Renderbuffer, depth bufferOpenGL:渲染缓冲区、深度缓冲区
【发布时间】:2012-03-10 21:38:42
【问题描述】:

我一直在从 freeglut 切换到 SFML 以创建 OpenGL 3.3 上下文/窗口。现在,当我使用 freeglut 并使用

初始化显示模式时
unsigned int displayMode = GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL;
glutInitDisplayMode (displayMode);

然后我可以简单地输入

glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
glDepthRange(0.0f, 1.0f);

然后将启用深度测试。但是,在 SFML 中,情况要复杂一些。我不会介绍 SFML 代码,但基本上 SFML 会为您创建一个上下文/窗口。您可以指定深度位和模板位的数量,但似乎 SFML 并未实际分配深度缓冲区并将其附加到默认帧缓冲区。

那么我该怎么做呢?我猜你必须做类似glGenRenderbuffers,然后是glBindRenderbuffer,然后是glRenderbufferStorage,然后是glFramebufferRenderbuffer。文档有点混乱。 glRenderbufferStorage 采用 internalformat 参数,我不确定如何表示我想要一个 24 位深度缓冲区。另外,我不确定如何访问默认帧缓冲区(或者是否有两个默认帧缓冲区,因为有双缓冲?)。

【问题讨论】:

    标签: opengl sfml


    【解决方案1】:

    当你创建你的窗口时,你可以指定允许你定义深度/模板缓冲格式的上下文设置。像这样的:

     sf::Window window(sf::VideoMode(1024, 768, 32), "SFML Window", sf::Style::Default, sf::ContextSettings(24, 8, 0, 3, 3));
    

    上面将指定一个带有 8 位模板的 24 位深度缓冲区。我假设您在这里使用的是 SFML 2.0。不确定它是否仍处于测试阶段,或者当然是最终版本。

    【讨论】:

      【解决方案2】:

      在 SFML 中,深度可以通过 ContextSettings 启用。

      //Configuring SFML window
      sf::ContextSettings window_settings;
      window_settings.depthBits         = 24; // Request a 24-bit depth buffer
      window_settings.stencilBits       = 8;  // Request a 8 bits stencil buffer
      window_settings.antialiasingLevel = 2;  // Request 2 levels of antialiasing
      
      // Opening SFML window
      sf::Window window(sf::VideoMode(800, 600), "Title", sf::Style::Resize | sf::Style::Close, window_settings);
      glewExperimental = GL_TRUE;
      
      // Initializing glew and openGL
      glewInit();
      glViewport(0, 0, 800, 600);
      
      // Enabling Depth
      glEnable(GL_DEPTH_TEST);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多